转摘自:http://blog.csdn.net/mxgsgtc/article/details/13005675
以前老是被从文本里读取文件,然后逐个的进行字符解析,感觉非常的慢,自从知道了fscanf函数之后,一切变的so easy!
fscanf函数用于从文本里读一个字符串到指定的数组里面:
- #include <stdio.h>
- #include <string.h>
- struct node{
- char a[20];
- char b[20];
- char c[20];
- char d[20];
- };
- int main()
- {
- FILE *fp;
- struct node buf;
- memset(&buf, 0x00, sizeof(buf));
- fp=fopen("1.txt", "r");
- fscanf(fp,"%[^,],%[^,],%[^,],%s",buf.a,buf.b,buf.c,buf.d);
- printf("[%s][%s][%s][%s] ",buf.a,buf.b,buf.c,buf.d);
- return 0 ;
- }
这里面要注意的是 1.txt里面的内容是这样的 001data,DI,50,12345 没错,是用“,”号隔开的一些列字符串,以前我们在解析的时候是把这一行读出来,然后再一个一个字符解析,如果遇到“,”的话就分出一个字符串,但是fscanf一句话就搞定了,这里%[ ],是扫描集的意思,%[^,]其中^的意思就是当fscanf一个一个字符从文件读上来的时候如果遇到“,”字符就会停下来,就会把前面读取的字符存到buf中,比如 1.txt里的内容,fscanf会一次的读取001data 当他发现后面有“,”字符的时候就将001data存入buf.a中去了,也就是说^的意思是取反,就是遇到^后面的数就会停下来,那么,%[^,],%[^,] 这种连着的用法又是什么意思呢,注意,%[^,] , %[^,]之间有个“,”,其实是这样的,先看一下一个小例子
- #include <stdio.h>
- #include <string.h>
- struct node{
- char a[20];
- char b[20];
- char c[20];
- char d[20];
- };
- int main()
- {
- FILE *fp;
- struct node buf;
- memset(&buf, 0x00, sizeof(buf));
- fp=fopen("1.txt", "r");
- fscanf(fp,"001d%s",buf.a);
- printf("[%s] ",buf.a);
- return 0 ;
- }
这里1.txt中的内容与上面的一样,但是最后的输出结果是: ata,DI,50,12345
这回大家应该明白了吧,这个小例子中"001d%s“意思就是说从文本中读取字符串,从"001d"之后的字节开始读取,这回明白了fscanf(fp,"%[^,],%[^,],%[^,],%s",buf.a,buf.b,buf.c,buf.d);的意思了 ,就是说fscanf先读取到001data的时候,发现后面有逗号,于是停下并且赋值,赋值之后(第一次赋值)
剩余字符串变为",DI,50,12345" 也就是说第一个是" , "号,那么接下来scanf会省略这个逗号,从逗号后面的字符D开始继续读取在遇到第二个逗号,读取第二个字符串
即50,所以一次类推
总结:那么以后可以任意的分解字符串了,比如文件里的1.txt文件中的内容为 001data|DI,50 | 12345
我就可以这么分fscanf(fp,"%[^|]|%[^,],%[^|]|%s",buf.a,buf.b,buf.c,buf.d); 分成的结果就是 001data DI 50 12345
这里还要注意fscanf与fget函数的区别:
fscanf 函数遇到空格或是' ',都会停掉换到下一行
而fget函数只有遇到' '才会换到下一行