使用fscanf()读取一行时遇到问题

6 c file input std

我正在尝试使用以下代码读取一行:

while(fscanf(f, "%[^\n\r]s", cLine) != EOF )
{
    /* do something with cLine */
}
Run Code Online (Sandbox Code Playgroud)

但不知怎的,我每次只得到第一行.这是一条读线的坏方法吗?我该怎么办才能让它按预期工作?

pax*_*blo 19

使用该函数几乎总是一个坏主意,fscanf()因为它可能会在失败时将文件指针留在未知位置.

我更愿意用它fgets()来获得每一行然后sscanf().然后,您可以根据需要继续检查读入的行.就像是:

#define LINESZ 1024
char buff[LINESZ];
FILE *fin = fopen ("infile.txt", "r");
if (fin != NULL) {
    while (fgets (buff, LINESZ, fin)) {
        /* Process buff here. */
    }
    fclose (fin);
}
Run Code Online (Sandbox Code Playgroud)

fgets() 似乎是你正在尝试做的事情,读取字符串直到遇到换行符.


JSB*_*ոգչ 1

在我看来,您正在尝试在 fscanf 字符串中使用正则表达式运算符。该字符串 [^\n\r]对 fscanf 没有任何意义,这就是您的代码无法按预期工作的原因。

此外,如果项目不匹配,fscanf() 不会返回 EOF。相反,它返回一个指示匹配数量的整数——在您的情况下可能为零。仅在流末尾或发生错误时返回 EOF。因此,在您的情况下发生的情况是,第一次调用 fscanf() 会一直读取到文件末尾以查找匹配的字符串,然后返回 0 以让您知道未找到匹配项。第二次调用然后返回 EOF,因为整个文件已被读取。

最后,请注意 %s scanf 格式运算符仅捕获下一个空白字符,因此在任何情况下都不需要排除 \n 或 \r。

有关更多信息,请参阅 fscanf 文档:http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/