【问题标题】:Reading one line at a time in C在 C 中一次读取一行
【发布时间】:2011-01-23 06:55:54
【问题描述】:

在 C 语言中,可以使用哪种方法从文件中一次读取一行?

我正在使用 fgets 功能,但它不起作用。 它只读取空格分隔的标记。

怎么办?

【问题讨论】:

  • 所以你不是真的想读一行,你想一直读到遇到空格?或者您是说 fgets 停止在空格而不是换行符上?
  • 应该只在换行符处停止。
  • 这是我的输入:: START A DC 10 B DS 20 STOP 我得到了:: START A B STOP 作为我的输出..

标签: c file


【解决方案1】:

使用以下程序从文件中逐行获取。

#include <stdio.h>
int main ( void )
{
  char filename[] = "file.txt";
  FILE *file = fopen ( filename, "r" );

  if (file != NULL) {
    char line [1000];
    while(fgets(line,sizeof line,file)!= NULL) /* read a line from a file */ {
      fprintf(stdout,"%s",line); //print the file contents on stdout.
    }

    fclose(file);
  }
  else {
    perror(filename); //print the error message on stderr.
  }

  return 0;
}

【讨论】:

    【解决方案2】:

    当您由于某种原因无法使用fgets() 时,这应该可以工作。

    int readline(FILE *f, char *buffer, size_t len)
    {
       char c; 
       int i;
    
       memset(buffer, 0, len);
    
       for (i = 0; i < len; i++)
       {   
          int c = fgetc(f); 
    
          if (!feof(f)) 
          {   
             if (c == '\r')
                buffer[i] = 0;
             else if (c == '\n')
             {   
                buffer[i] = 0;
    
                return i+1;
             }   
             else
                buffer[i] = c; 
          }   
          else
          {   
             //fprintf(stderr, "read_line(): recv returned %d\n", c);
             return -1; 
          }   
       }   
    
       return -1; 
    }
    

    【讨论】:

    • thanx buddy 它的工作,但我仍然有一个问题.. 我的缓冲区正在读取和存储整行,但在打印时只打印第一个空格分隔的令牌
    • 这很奇怪,我可以使用printf("%s\n", buffer); 它输出整个缓冲区
    • 是的,这对我来说也很奇怪。因为它适用于所有以前的程序... :'(
    • 您确定您的文件不包含任何字符串终止符吗?
    【解决方案3】:

    如果您正在为具有可用 GNU C 库的平台进行编码,则可以使用 getline():

    http://www.gnu.org/s/libc/manual/html_node/Line-Input.html

    【讨论】:

    • 该功能在 BSD 系统中也可用,仅供参考;)
    【解决方案4】:

    fgets 函数将从文件中读取一行或num 字符,其中num 是传递给fgets 的第二个参数。您是否传递了足够大的数字来读取该行?

    举例

    // Reads 500 characters or 1 line, whichever is shorter
    char c[500];
    fgets(c, 500, pFile);
    

    对比

    // Reads at most 1 character
    char c;
    fgets(&c,1,pFile);
    

    【讨论】:

    • @JaredPar:酷!你修好了! :P 嘿,我在从 0 降到 -1 后投了赞成票,然后在你纠正它时投了赞成票,让它回到零,而不是跳到 1...这是我的浏览器还是故障?
    • @t0mm13b 要恢复您的反对票,请再次单击反对票按钮。投反对票,然后投赞成票!= 既不投反对票,也不投反对票。
    【解决方案5】:

    这更像是一个评论而不是一个完整的答案,但我没有足够的评论点。 :)

    这是 fgets() 的函数原型:

    char *fgets(char *restrict s, int n, FILE *restrict stream);
    

    它将读取 n-1 个字节或最多一个换行符或 eof。欲了解更多信息,请参阅here

    【讨论】:

      【解决方案6】:

      fgets() 应该是要走的路……

      【讨论】:

      • 只要缓冲区足够大
      • Tom:这就是第二个参数的用途,以避免超出缓冲区。还是您的意思是没有预见到足够大的缓冲区? IIRC,我的 C 编译器在单行上有 512 字节的限制。
      • 那是哪个 C 编译器?而且我正在考虑您不知道线路有多长的情况,例如标准输入。不是想就此发动一场圣战。
      【解决方案7】:

      如果您知道您的行将适合缓冲区,请使用 fgets 或使用 fgetc 来更好地控制阅读

      【讨论】:

        【解决方案8】:

        使用fgets 从行中读取,然后使用getc(...) 咀嚼换行符或行尾以继续阅读....这里是一个永远读取一行的示例...

        // 读取 500 个字符或 1 行,以较短者为准 char c[500],咀嚼; 而(真){ fgets(c, sizeof(c), pFile); 如果(!feof(pFile)){ 咀嚼= getc(pFile); // 咀嚼换行符终止符 // 用 C 做一些事情 }别的{ 休息; // 文件结束... } }

        【讨论】:

          【解决方案9】:

          错误来源:

          其实这不是我的错.. 在这种情况下 。 我正在使用 strtok 函数并且不小心修改了我原来的原始字符串。 因此,在打印时我遇到了错误...

          感谢大家帮助我.. :)

          【讨论】:

            【解决方案10】:

            您可以使用 fscanf 代替 fgets。因为 fgets fscanf 用于包括空格在内的字符,但是在使用 fscanf 时,您可以单独访问保存在文件中的数据。例如,有一个名称为 roll 的文件。现在声明一个字符串和两个整数行。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-10-16
              • 2018-02-06
              • 1970-01-01
              • 1970-01-01
              • 2011-09-03
              • 1970-01-01
              • 2021-12-05
              相关资源
              最近更新 更多