我制作了一个简单的C代码,用于比较文件流的两种情况。两者都在读取.txt文件并将其读取的内容写入新的.dat文件(二进制文件)。问题是结果文件的不同取决于.txt文件中光标的位置,这意味着文件末尾是否存在'\ n'。左边的句子在最后一句没有'\ n',但是右边的情况没有。我认为这与“节目何时通知'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);
}
感谢。
答案 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
。