程序何时识别EOF?

时间:2015-01-22 15:48:05

标签: c file stream

我制作了一个简单的C代码,用于比较文件流的两种情况。两者都在读取.txt文件并将其读取的内容写入新的.dat文件(二进制文件)。问题是结果文件的不同取决于.txt文件中光标的位置,这意味着文件末尾是否存在'\ n'。左边的句子在最后一句没有'\ n',但是右边的情况没有。我认为这与“节目何时通知'EOF'有关?”。请帮我。 enter image description here

,代码如下。

#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);
}

感谢。

1 个答案:

答案 0 :(得分:1)

将while条件更改为

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

fgets()尝试读取超出EOF时,指针已设置,因此如果您检查feof()的返回值,则fgets()将在读取失败后返回true 1}}将在文件末尾返回NULL,您可以避免此问题。

这个问题有一定的频率,并且有一个很好的答案here

另外,你不应该这样做

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

因为您不知道50 char是否成功阅读,而是使用fread()

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