在C中一次读一行

时间:2010-03-03 16:03:03

标签: c file

可以使用哪种方法从C中的文件一次读取一行?

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

怎么办?

10 个答案:

答案 0 :(得分:16)

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

#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;
}

答案 1 :(得分:12)

如果由于某种原因无法使用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; 
}

答案 2 :(得分:8)

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

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

答案 3 :(得分:7)

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

例如

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

Vs以上。

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

答案 4 :(得分:3)

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

这是fgets()的函数原型:

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

它将读取n-1个字节或直到新行或eof。有关详细信息,请参阅here

答案 5 :(得分:2)

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

答案 6 :(得分:2)

如果您知道自己的行符合缓冲区或使用fgets来更好地控制阅读

,请使用fgetc

答案 7 :(得分:2)

使用fgets从该行读取,然后使用getc(...)来修改换行符或行尾以继续阅读....这是永远读取一行的示例。 ..

// Reads 500 characters or 1 line, whichever is shorter
char c[500], chewup;
while (true){
    fgets(c, sizeof(c), pFile);
    if (!feof(pFile)){
        chewup = getc(pFile); // To chew up the newline terminator
        // Do something with C
    }else{
        break; // End of File reached...
    }
}

答案 8 :(得分:0)

错误来源:

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

感谢大家帮助我.. :)

答案 9 :(得分:-1)

您可以使用fscanf而不是fgets。因为fgets fscanf用于包含空格的字符但是在使用fscanf时你可以单独访问保存在file.eg中的数据。这里有一个名为class roll.now的文件声明一个字符串和两个整数行。