c - 如何在 feof() 中递增 while 循环以在 C 中读取

标签 c file

我有以下代码。

 while( !feof(fp1) && !feof( fp2)
 {
    fscanf(fp1, "%s", name);
    fscanf( fp2, "%s", usn);
    fprintf(fp3, "%s%s\n", name, usn);
 }

据我所知,读取 EOF 时将设置 feof 标志。但是它是如何一个接一个地读取文件中的字符串的呢? 我没有在循环中包含任何此类代码。它仍然读取所有字符串直到两个文件中的末尾并写入 fp3。 请解释

最佳答案

针对 EOF 测试 fscanf() 的结果。

feof() 表示EOF 发生在前一个 IO 操作上。

 while ((fscanf(fp1, "%s", name) != EOF) && (fscanf( fp2, "%s", usn) != EOF)) {
   fprintf(fp3, "%s%s\n", name, usn);
}

详细信息:

“读取 EOF 时将设置 feof 标志”具有误导性。 EOF 不是被读取的东西。这种情况发生在尝试输入但由于没有更多数据可能而失败时。在 C 中,代码在尝试读取输入之前不知道输入的下一个 char 是否可用。代码需要尝试读取并失败 - 然后设置 EOF 条件。

fscanf(fp1, "%s", name); 这样的代码不会检查 fscanf() 的返回值。这是危险的,因为代码不能保证任何内容都被读入了 namescanf() 成功(或不成功)的确定性是通过检查返回值获得的。

“它是如何在文件中一个接一个地读取字符串的?...”只能猜测,因为发布的代码是错误的。 while( !feof(fp1) && !feof( fp2) { 至少 缺少一个 )。至于 OP 的真实代码是什么,那就是猜测了。

假设 while( !feof(fp1) && !feof( fp2)) {,代码循环重复地从每个文件中读取一串非空白字符。它在最后一次读取时继续一次太频繁fp1 和/或fp2 达到它们的EOF 条件,因此最后一个printf () 可能包含先前读取的 name 和/或 usn 的重复。

OP 没有显示name,usn 的声明。很可能,这些中的任何一个都不足以读取数据并且缓冲区溢出导致未定义的行为。 @灰

关于c - 如何在 feof() 中递增 while 循环以在 C 中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26600749/

相关文章:

java - 在Linux中从Java访问 "~"(用户主目录)

python - 在 Python 中将文件列表连接成字符串列表

json - 如何用jq合并两个json文件

file - Cordova - 下载下载文件夹中的文件

函数中的 C 错误 : unknown type name 'FILE' ,

c语句中的编译错误

C 程序链表语法

c - 另一个大小的数组

c - ESP8266-01 于 2013 年 1 月 8 日发布,第一个原因 :4, 启动模式 :(3, 7)

c# - 自更新应用问题