程序什么时候识别 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
。
我做了一个简单的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
。