用fscanf理解循环

时间:2014-03-09 09:16:27

标签: c++

我有一些我想要解读的代码。我的C ++知识有点生疏,所以也许我可以得到一些指示(双关语)来揭示下面的代码摘录:

vector<int> vArray;
FILE * fData;
fData = fopen ("some://path/file.txt", "r");
int iValue;
while(fscanf(fData, "%d", &iValue) != EOF){
 vArray.push_back(iValue);
}
fclose(fData);

我提出的两个问题如下:

  1. while的{​​{1}}循环如何正常工作?它是按行,字符还是其他方式阅读?
  2. 如果文件中有浮点值,例如0.05,1.22或-5.3,会发生什么?有类型转换吗?
  3. 据我了解,fscanf是一个只包含整数的向量,vArray会将vArray.push_back(iValue)的值附加为向量的新条目。我不明白的是将值赋值给iValue的方法。

3 个答案:

答案 0 :(得分:1)

fscanf函数返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

答案 1 :(得分:1)

1. fscanf的while循环如何正常工作?它是按行,字符还是其他方式阅读?

fscanf从流中读取数据,并根据参数格式将它们存储到附加参数指向的位置。

2.如果文件中有浮点值,例如0.05,1.22或-5.3,会发生什么?是否有类型转换?

如果要读取浮点值,则应使用%f。我认为你的循环只会读取整数。 有关更多信息,请参阅fscanf here

答案 2 :(得分:1)

scanf系列函数,当以问题代码等简单方式使用时,将首先读取并忽略任何空格,然后根据格式转换解析输入,直到下一个不兼容的字符进行该格式转换,通常是下一个空格。空格和换行符的处理方式相同,因此输入不需要是面向行的。

EOF常量定义为-1,这是 stdio 函数在IO错误或文件结束时返回的内容。因此while循环将继续读取,直到fscanf遇到IO错误或文件结束。

但是,此代码非常糟糕,因为scanf系列函数返回成功解析的项目数。如果文件中存在非数字数据,则无法解析要求在代码中解析的1个整数。所以它返回0而不是1表示没有解析任何内容,它会将第一个无效字符留给流。

因此,如果文件fscanf中存在无效数据,则返回0(iValue未更改),这不是EOF,因此循环继续。下一个fscanf再次读取无效数据,返回0,并且您有无限循环。

顺便说一句,如果其中包含.的浮点值,则会发生这种情况,因为.在解析整数时是无效的字符。

简单修复是将条件更改为

while(fscanf(fData, "%d", &iValue) == 1){

然后循环将在返回值EOF0上退出,并且避免无限循环。在实际代码中,您可能希望以不同方式处理文件结束和解析错误。