它总是在最后打印一个额外的字符。代码如下:

#include <stdio.h>

int main ()
{
    char bit;
    FILE *fp_read,*fp_write;
    fp_read = fopen("test.txt","r");

    if(fp_read==NULL) {
        printf("Error!! Unable to open the file!!");
        return 1;
    }
    while(!feof(fp_read)) {
        fscanf(fp_read,"%c",&bit);
        printf("%c",bit);
    }
    fclose(fp_read);

    return 0;
}

如果test.txt包含010101,则会打印0101011。如果00110打印001100。如果它包含abc,它会打印abcc。这意味着它总是重复最后一个字符。
怎么了?有人能解释吗?

最佳答案

我无法重现这个错误。
请参阅原始帖子中的David Bowling的第一条评论,以获得一个简洁的解释。
cppreference page for feof的版本较短。
eof函数只报告最新I/O操作报告的流状态,而不检查关联的数据源。例如,如果最近的I/O是返回文件最后一个字节的fgetc,则feof返回零。下一个fgetc失败并将流状态更改为文件结尾。只有当feof返回非零时。
在典型用法中,输入流处理在任何错误时都会停止;然后使用feof和feror来区分不同的错误条件。
这意味着在while循环中使用feof可能不合适。文件的最后一个字符可能是垃圾,在不同的系统中会有所不同。
试着这样做吧。

while(fscanf(fp_read,"%c",&bit) != EOF) {
    printf("%c",bit);
}

关于c - fscanf在末尾扫描额外的字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43954011/

10-08 23:18