我有以下代码。
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()
的返回值。这是危险的,因为代码不能保证任何内容都被读入了 name
。 scanf()
成功(或不成功)的确定性是通过检查返回值获得的。
“它是如何在文件中一个接一个地读取字符串的?...”只能猜测,因为发布的代码是错误的。 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/