fscanf正在扫描一个额外的字符

时间:2017-05-13 13:59:27

标签: c scanf

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

#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。这意味着它总是重复最后一个角色。

有什么问题?谁能解释一下?

1 个答案:

答案 0 :(得分:0)

我无法重现错误。

请参阅David Bowling在原帖中的第一条评论,以获得简洁的解释。

cppreference page for feof版本较短。

  

eof函数仅报告最近I / O操作报告的流状态,它不检查关联的数据源。例如,如果最近的I / O是fgetc,它返回文件的最后一个字节,则feof返回零。下一个fgetc失败并将流状态更改为文件结尾。只有那时feof返回非零。   在典型的使用中,输入流处理在任何错误上停止;然后使用feof和ferror来区分不同的错误条件。

这意味着在while循环中使用feof可能不合适。文件中的最后一个字符可能是垃圾,在不同的系统中会有所不同。

尝试这样做。

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