可以使用哪种方法从C中的文件一次读取一行?
我正在使用 fgets 功能,但它无效。 它只读取空格分隔的标记。
怎么办?
答案 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():
答案 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的文件声明一个字符串和两个整数行。