我有一些我想要解读的代码。我的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);
我提出的两个问题如下:
while
的{{1}}循环如何正常工作?它是按行,字符还是其他方式阅读?据我了解,fscanf
是一个只包含整数的向量,vArray
会将vArray.push_back(iValue)
的值附加为向量的新条目。我不明白的是将值赋值给iValue
的方法。
答案 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){
然后循环将在返回值EOF
和0
上退出,并且避免无限循环。在实际代码中,您可能希望以不同方式处理文件结束和解析错误。