fscanf函数的应用

转摘自:http://blog.csdn.net/mxgsgtc/article/details/13005675


以前老是被从文本里读取文件,然后逐个的进行字符解析,感觉非常的慢,自从知道了fscanf函数之后,一切变的so easy!

fscanf函数用于从文本里读一个字符串到指定的数组里面:

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. struct node{  
  4.     char a[20];  
  5.     char b[20];  
  6.     char c[20];  
  7.     char d[20];  
  8. };  
  9. int main()  
  10. {  
  11.     FILE *fp;  
  12.     struct node buf;  
  13.     memset(&buf, 0x00, sizeof(buf));  
  14.     fp=fopen("1.txt""r");  
  15.     fscanf(fp,"%[^,],%[^,],%[^,],%s",buf.a,buf.b,buf.c,buf.d);  
  16.   
  17.     printf("[%s][%s][%s][%s]\n",buf.a,buf.b,buf.c,buf.d);  
  18.     return 0 ;  
  19. }  

这里面要注意的是 1.txt里面的内容是这样的 001data,DI,50,12345 没错,是用“,”号隔开的一些列字符串,以前我们在解析的时候是把这一行读出来,然后再一个一个字符解析,如果遇到“,”的话就分出一个字符串,但是fscanf一句话就搞定了,这里%[ ],是扫描集的意思,%[^,]其中^的意思就是当fscanf一个一个字符从文件读上来的时候如果遇到“,”字符就会停下来,就会把前面读取的字符存到buf中,比如 1.txt里的内容,fscanf会一次的读取001data 当他发现后面有“,”字符的时候就将001data存入buf.a中去了,也就是说^的意思是取反,就是遇到^后面的数就会停下来,那么,%[^,],%[^,] 这种连着的用法又是什么意思呢,注意,%[^,]  %[^,]之间有个“,”,其实是这样的,先看一下一个小例子

  1. #include <stdio.h>  
  2. #include <string.h>  
  3. struct node{  
  4.     char a[20];  
  5.     char b[20];  
  6.     char c[20];  
  7.     char d[20];  
  8. };  
  9. int main()  
  10. {  
  11.     FILE *fp;  
  12.     struct node buf;  
  13.     memset(&buf, 0x00, sizeof(buf));  
  14.     fp=fopen("1.txt""r");  
  15.     fscanf(fp,"001d%s",buf.a);  
  16.   
  17.     printf("[%s]\n",buf.a);  
  18.     return 0 ;  
  19. }  


这里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 函数遇到空格或是'\n',都会停掉换到下一行

而fget函数只有遇到'\n'才会换到下一行


posted @ 2013-11-10 23:45  奋斗中的毛毛虫  Views(1663)  Comments(1Edit  收藏  举报