【问题标题】:How to skip a line when fscanning a text file?扫描文本文件时如何跳过一行?
【发布时间】:2011-02-17 11:33:49
【问题描述】:

我想在阅读前扫描一个文件并跳过一行文本。我试过了:

fscanf(pointer,"\n",&(*struct).test[i][j]);

但是这个语法只是从第一行开始。

【问题讨论】:

    标签: c file scanf


    【解决方案1】:

    我可以使用以下指令跳过带有 scanf 的行:

    fscanf(config_file, "%*[^\n]\n");
    

    格式字符串匹配包含任何字符(包括空格)的行。格式字符串中的* 表示我们对保存行不感兴趣,而只是对增加文件位置感兴趣。

    格式字符串说明:
    %是每个scanf格式字符串开头的字符;
    *表示不要把找到的pattern放在任何地方(通常你保存pattern找到格式字符串后面的参数,此时参数为NULL);
    [^\n]表示除换行符以外的任何字符;
    \n表示换行符;

    所以[^\n]\n 表示以换行符结尾的全文行。

    参考here

    【讨论】:

    • '\n' 是空格,这意味着消耗了任意数量的空格,而不仅仅是单个换行符。
    • 还应该提到的是,fscanf的实现方式是将整行读入内存然后释放。
    【解决方案2】:

    fgets 将获取一行,并从下一行开始设置文件指针。然后,您可以在第一行之后开始阅读您想要的内容。

    char buffer[100];
    fgets(buffer, 100, pointer);
    

    只要您的第一行少于 100 个字符,它就可以工作。否则,必须检查并循环。

    【讨论】:

      【解决方案3】:

      目前尚不清楚您要将数据存储到什么中,因此很难猜出答案,顺便说一下,您可以跳过字节,直到遍历 \n

      FILE *in = fopen("file.txt", "r");
      

      然后您可以使用fgets 跳过整行,但这不安全(因为您需要先验估计行的长度),否则使用fgetc

      char c;
      do {
        c = fgetc(in);
      } while (c != '\n');
      

      最后,您应该在 fscanf 中包含格式说明符来实际解析数据,例如

      fscanf(in, "%f", floatVariable);
      

      您可以参考here 获取说明符。

      【讨论】:

        【解决方案4】:

        fgets 可以在这里工作。

        #define MAX_LINE_LENGTH 80
        
        char buf[MAX_LINE_LENGTH];
        
        /* skip the first line (pFile is the pointer to your file handle): */
        fgets(buf, MAX_LINE_LENGTH, pFile);
        
        /* now you can read the rest of your formatted lines */
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-31
          • 1970-01-01
          • 1970-01-01
          • 2021-11-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多