我可以使用以下代码扫描到文件末尾:
while(scanf("%d",&a) != EOF) //. . .
while(scanf("%d",&a) == 2) // . . .
while(scanf("%d",&a)+1) // . . .
我的问题非常明确:我可以使用 代替 这些代码?
答案 0 :(得分:2)
最好的方法不是他们。
最后一个是错的,因为它假设EOF
是-1,这不一定是真的。第二个是错误的,因为scanf
永远不会返回2
格式字符串。第一个有一个镜头,但也不是那么好。
如果循环while(scanf("%d",&a) != EOF)
,则循环终止于文件末尾(或文件读取错误)。但是,如果出于非文件错误原因scanf
失败,则不会检测到它。其中一个错误就是满足%d
无法转换的输入,例如字母表中的字母。
scanf
返回成功读取的项目数。换句话说,如果您有N
个%...
s(%*...
除外),那么scanf
应该返回N
,否则会出错。此错误可能是输入错误,文件读取错误或文件结束。
因此,检查scanf
成功的最安全方法是检查它是否可以读取您要求的项目数。在您的情况下,这是:
while (scanf("%d",&a) == 1)
答案 1 :(得分:1)
你不能不检查EOF。否则它将等待另一个输入。假设您想要在包含输入的文件时获取输入。最简单的方法是第一个,检查你是否在“文件结束”。现在,scanf
返回什么。它将返回已成功完成的输入。如果它可以扫描一个整数,如scanf("%d",&a)
,它将返回1. scanf("%d%d%d%d%d%d",&a,&a,&a,&a,&a,&a)
这将返回6.因此,==
您正在检查它是否每次都输入正确的输入量。因此,如果金额不正确,您可以像if(scanf("%d",&a)!=1) break
一样退出或退出。
您的while(scanf("%d",&a) == 2)
错误,应为while(scanf("%d",&a) == 1)
while(scanf("%d",&a)+1)
好吗?我不这么认为...... while(scanf("%d",&a)-1)
可能没事。
希望这很清楚。
答案 2 :(得分:0)
scanf()
将返回0(输入错误),1(良好)或EOF(不再输入)。处理相应的。
int result;
while ((result = scanf("%d",&a)) == 1) {
Handle_int(a);
}
if (result == 0) {
Handle_BadData(); // Maybe someone typed non-numeric text
}
else if (result == EOF) {
Handle_EOForIOError();
}
else {
; // This should never happen -else condition not needed
}
不要假设EOF
为-1,但它是否定的。