C语言处理json文件的总结,用于数据处理和数据分析等。解决中文乱码、字符串包含双引号、移动文件指针等问题。附上知识笔记

用C语言处理json文件在大部分情况下显然不是最好的办法,但在某些时候也拿得出手,例如:不熟悉其他语言、业务需求过于自定义、想锻炼一下编程能力等。

最近在开发一个小程序项目,准备作为作品参加中国高校计算机大赛系列的微信小程序应用开发赛,开发过程中问题层出不穷,由于小队中没有人学过大数据相关的知识,大量数据无法恰当处理,无奈下我拿出了C语言完成了各种用于数据处理及分析的脚本。

关于“C语言处理json文件”总结出下面几点:

  1. 许多c99标准的C\C++编译器的默认字符串编码格式是ANSI,而微信小程序云的数据库导出来的json数据字符串编码格式是utf8,若直接进行文件处理会发生乱码现象,解决方法有很多,我这里建议先将json文件的字符串编码格式转化成ANSI再处理,如下图所示记事本中点“文件”->“另存为”->“编码”。
    C语言处理json文件的总结,用于数据处理和数据分析等。解决中文乱码、字符串包含双引号、移动文件指针等问题。附上知识笔记_第1张图片

  2. C语言如果从文件指针在文件中间开始写,会发生覆盖,而不是插入字符,不管你是使用fwrite( )还是fputs( )或是别的函数。所以建议一个空文件用来写需要存储的数据,一个文件待处理的文件用来读,而数据的处理在内存中进行,对应的需要两个文件指针同时进行(因为如果数据量过大时肯定不能全存内存里,要边输入边处理边输出),记住三个文件的字符串编码格式要统一!

  3. 像register ch=fgetc(fp1)这种极高频率使用字符变量一般建议申请到寄存器中,尤其是程序需要多次遍历一大段数据时,可能可以提高一点运行速度(这里说可能是因为寄存器空间不一定申请得到,得看具体的运行情况和处理器的安排)。

  4. 当一个文件指针一个个字符不断往后读取内容到内存中,而你想判断它读到某个字符串时停下来时,你可以像下面这样写效率比较高:

char *p;//记录读到的最后几位用于判断是否需要停止
char allstr [10240];//用于将读到的一段字符串存到内存中进行接下来的处理
char str[] = "\"}";//碰到该字符串就停止读,c语言文件处理时经常需要判断是否读到了'"}'。
char ch;//用于读文件          
while(1)
{
     
 	if((ch=fgetc(fp1))==EOF)exit (0);
	str[i++]=ch;
    str[i]='\0';//结束字符串
	p1 = &allstr[strlen(allstr)-3];//取得str中最后几位字符,(这里的3是你要判断停止读的字符串的长度再减一)
	if(!strcmp(p1,str))break;
}

上面就是我最常用到的一段代码结构,我们来分析一下其中的关键点:

6.字符串千万记得要以’\0’结尾,这个如果漏了会发生越界访问等,问题很严重。

7.如果你想表达这样一个字符串" "]}" ",像其他编程语言在外围加个单引号是行不通的,因为C语言的单引号括住就是字符,双引号括住就是字符串,所以得使用到转义符 \ ,像这样" \"]}\" "

8.判断文件指针是否正常地读到文件尾(文件结束的判断),if((ch=fgetc(fp1))==EOF)exit (0);
C语言中的EOF其实就是一个宏,值为-1,就相当于这样#define EOF (-1),而ASCII代码值的范围是0~127,若读取到文件末尾的时候没有数据可供读取的时候,读文件函数(fgets, fgetc等)就会返回EOF值让我们来判断。

9.恰当的时候输出用于测试的语句到控制台,并且注意调试的技巧,看着内存的改变是否按照程序预期的情况。C语言处理文件时往往一段代码会循环很多次,我们要懂得在判断哪一次是我们想停下来看内存情况的。

10.灵活使用库函数,这里提几个最常用到的函数

strlen(str1)判断字符串长度,返回str1长度

strstr(str1,str2)判断str1是否包含str2,包含则返回str1中第一次出现str2的位置,不包含则返回null

strcpy(str1,str2)将str2复制到str1中,包括’\0’也复制过去(两个字符串的内存位置不改变,仅值传递,而且要特别注意str1的内存空间是否够存str2,若不够存会发生越界访问,并且不报错是最恐怖的)这里举个活用的例子 str(str1+strlen(str1),str2) 意思是将str2拼接到str1末尾,同理你也可以任意覆盖到str1中间的位置。

strcmp(str1,str2)比较字符串是否相等,如果str1 小于 str2返回值小于 0,如果str1 大于 str2则返回值大于 0,如果str1 等于 str2返回值等于0。

fseek()改变文件指针的位置(实现想读哪就读哪,想写哪就写哪,这种优越感只有C语言玩家才能体会到哈哈),这个函数的用法介绍稍微有点长,这里就不说明了,附上菜鸟教程的链接好了。
菜鸟教程库函数fseek()介绍,点我

11.一些容易忘的小细节,使用完文件指针记得fclose (),使用库函数记得引入头文件例如exit (0)的头文件#include

最后一点就是不要着急,如果你写的程序是在处理或分析海量数据时,跑个几十分钟甚至几个小时是完全有可能的,不妨端杯茶,感受一下看着自己写的程序帮自己干活的自豪感。

祝你随心所欲,享受C语言的自由感,品尝自己写出的代码的艺术!




——下面符附上一些C语言文件处理的笔记——
C语言处理json文件的总结,用于数据处理和数据分析等。解决中文乱码、字符串包含双引号、移动文件指针等问题。附上知识笔记_第2张图片
C语言处理json文件的总结,用于数据处理和数据分析等。解决中文乱码、字符串包含双引号、移动文件指针等问题。附上知识笔记_第3张图片
C语言处理json文件的总结,用于数据处理和数据分析等。解决中文乱码、字符串包含双引号、移动文件指针等问题。附上知识笔记_第4张图片

感谢阅读~~~

你可能感兴趣的:(编程技术,c++,大数据,经验分享,字符串,指针)