在C中一次读一行
可以使用哪种方法从C中的文件一次读取一行?
我正在使用fgetsfunction,但它不起作用。 它只读取空格分隔的标记。
该怎么办?
当你因某些原因无法使用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; }
使用以下程序从文件中逐行获取。
#include 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; }
如果您正在编写具有GNU C库可用的平台,则可以使用getline():
fgets
函数将从一个或多个字符读取一行,其中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);
这不是一个评论,而是一个完整的答案,但我没有足够的评论。 🙂
这是fgets()的函数原型:
char *fgets(char *restrict s, int n, FILE *restrict stream);
它将读取n-1个字节或直到新行或eof。 有关详情,请参阅此处
fgets()
应该是要走的路……
如果您知道您的线条适合缓冲区或使用fgetc
来更好地控制读取,请使用fgets
使用fgets
从行读取,然后使用getc(...)
来咀嚼换行符或行尾以继续阅读….这是一个永远阅读行的例子……
//读取500个字符或1行,以较短者为准 char c [500],chewup; while(true){ fgets(c,sizeof(c),pFile); if(!feof(pFile)){ chewup = getc(pFile); //咀嚼换行终结器 //用C做点什么 }其他{ 打破; //文件结尾到达了...... } }
错误来源:
实际上这不是我的错……在这种情况下。 我正在使用strtok函数,并且意外地修改了我原来的原始字符串。 因此,在打印时,我收到了错误……
谢谢大家帮助我.. 🙂
您可以使用fscanf而不是fgets。 因为fgets fscanf用于包含空格的字符但是在使用fscanf时你可以单独访问保存在file.eg中的数据。有一个名为class roll.now的文件声明一个字符串和两个整数行。