程序什么时候识别 EOF?

When does program recognize EOF?

我做了一个简单的C代码来比较两种文件流。两者都在读取 .txt 文件并将读取的内容写入新的 .dat 文件(二进制)。问题是结果文件根据光标在.txt文件中的位置而不同,这意味着'\n'是否存在于文件末尾。左格在最后一句没有'\n',但右格有。我认为这与"when does program notice 'EOF'?"有关。请帮我。

代码如下。

#include <stdio.h>
#include <string.h>

int main(){
    FILE* src = fopen("/Users/Chois/Desktop/test.txt", "rt");
    FILE* dest = fopen("/Users/Chois/Desktop/dest.dat", "wb");

    char buff[50];
    int countOfWirte = 0;

    if(src!=NULL && dest!=NULL){
        fgets(buff, 50, src);
        while(!feof(src)){
            fwrite(buff, sizeof(char), 50, dest);
            countOfWirte++;
            fgets(buff, 50, src);
         }
    }else{
        printf("fail");
    }

    printf("fwrite work %d times\n", countOfWirte);

    fclose(src);
    fclose(dest);
}

谢谢。

将 while 条件更改为

while (fgets(buff, 50, src) != NULL)

fgets() 尝试读取超出 EOF 时指示器已设置,因此 feof() 在读取失败后 return 为真,如果您改为检查fgets() 的 return 值将 return NULL 放在文件末尾,您可以避免这个问题。

这个问题被问得比较频繁,而且有一个很好的答案here

另外,你不应该这样做

fwrite(buff, sizeof(char), 50, dest);

因为不知道50 char是否成功读取,改用fread() like

size_t readBytes; 

while ((readBytes = fread(buf, 1, sizeof(buf), src)) > 0)
{
    fwrite(buf, 1, readBytes, dest);
    countOfWrite++;
}

或者如果你想从文件中读取行,那么 fprintf() 是合适的

while (fgets(buf, sizeof(buf), src) != NULL)
{
    fprintf(dest, "%s", buf);
    countOfWrite++;
}

哦,而且 sizeof(char) 必须是 1