zoukankan      html  css  js  c++  java
  • 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] ",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] ",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 函数遇到空格或是' ',都会停掉换到下一行

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


  • 相关阅读:
    博客作业01-抽象数据类型
    C语言最后一次作业--总结报告
    C语言博客作业--函数嵌套调用
    C语言博客作业--结构体
    数位DP之奥义
    POJ 3311 Hie with the Pie (状压DP)
    kaungbin_DP S (POJ 3666) Making the Grade
    POJ 3666 Making the Grade
    kuangbin_SegTree M (HDU 4553)
    kuangbin_SegTree I (HDU 1540)
  • 原文地址:https://www.cnblogs.com/ycpanda/p/3637362.html
Copyright © 2011-2022 走看看