我有以下代码。
while( !feof(fp1) && !feof( fp2)
{
fscanf(fp1, "%s", name);
fscanf( fp2, "%s", usn);
fprintf(fp3, "%s%s\n", name, usn);
}
在这种情况下,我知道在读取EOF时会设置feof标志。但是,它如何在文件中一个又一个地读取字符串?我没有在循环中包含任何此类代码。它仍然读取两个文件中的所有字符串,直到最后,并写入fp3。请解释
测试fscanf()
EOF的结果。
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
。完全有可能,这两个都不足以读取数据并且缓冲区溢出,从而导致不确定的行为。@灰
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句