我有以下代码。
while( !feof(fp1) && !feof( fp2)
{
fscanf(fp1, "%s", name);
fscanf( fp2, "%s", usn);
fprintf(fp3, "%s%s\n", name, usn);
}
在此我明白,当读取EOF时将设置feof标志。但它如何在文件中读取一个接一个的字符串? 我没有在循环中包含任何此类代码。它仍然会读取所有字符串直到文件中的结尾并写入fp3。 请解释
答案 0 :(得分:2)
为EOF测试fscanf()
的结果。
feof()
表示{em>上一次 IO操作发生了EOF
。
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
的声明。很可能,其中任何一个都不足以进行数据读取,缓冲区溢出会导致未定义的行为。 @ash
答案 1 :(得分:0)
关闭括号.. while( !feof(fp1) && !feof( fp2) )
而且,你没有包含任何代码来从文件中读取字符串并写入另一个文件?但我可以看到fscanf()
和fprintf()
!