请参阅下面的c ++函数。其重点是将变量存储在全局数组的输入文件(“is”)中。我通过调试器查看“temp”变量(第一个if语句似乎工作正常),并且在读取输入文件的第一行后,变量temp不再更新。
该文件采用特定的格式,因此它应该读取一个int,尽管我最终在KEYFRAME if语句的末尾放了一个char来查看它是否正在读取endline字符(它不是)。 / p>
有什么可能的原因?非常感谢你!
void readFile(istream& is){
string next;
int j = 0;
int i = 0;
while (is){
for (int i = 0; i < F; i++){
is >> next;
if (next == "OBJECT")
{
int num;
is >> num;
string name;
is >> name;
objects[j].objNum = num;
objects[j].filename = name;
j++;
}
else if (next == "KEYFRAME"){
int k;
int temp;
is >> k;
int time;
is >> time;
objects[k].myData[time].setObjNumber(k);
objects[k].myData[time].setTime(time);
is >> temp;
objects[k].myData[time].setPosition('x', temp) ;
is >> temp;
objects[k].myData[time].setPosition('y', temp);
is >> temp;
objects[k].myData[time].setPosition('z', temp);
is >> temp;
objects[k].myData[time].setRotation('x', temp);
is >> temp;
objects[k].myData[time].setRotation('y', temp);
is >> temp;
objects[k].myData[time].setRotation('z', temp);
is >> temp;
objects[k].myData[time].setScaling('x', temp);
is >> temp;
objects[k].myData[time].setScaling('y', temp);
is >> temp;
objects[k].myData[time].setScaling('z', temp);
char get;
is >> get;
}
else {
cout << "Error reading input file";
return;
}
}
}
}
答案 0 :(得分:0)
可以使用以下简单示例演示std::istream
operator>>
#include <sstream>
#include <iostream>
int main() {
std::string sample_input="1 2 3 A 4 5";
std::istringstream i(sample_input);
int a=0, b=0, c=0, d=0;
std::string e;
int f=0;
i >> a >> b >> c >> d >> e >> f;
std::cout << a << std::endl;
std::cout << b << std::endl;
std::cout << c << std::endl;
std::cout << d << std::endl;
std::cout << e << std::endl;
std::cout << f << std::endl;
}
未更新变量的最常见原因:
1
2
3
0
0
此程序产生的结果是:
operator>>
此示例强制第四个参数发生转换错误。 operator>>
遇到格式转换错误后,会在流上设置错误位,从而阻止进一步转换。
使用operator>>
时,有必要在每次输入格式转换后检查转换错误,并在必要时重置流的状态。
所以,你的答案是你在某个地方有输入转换错误。我通常避免使用operator>>
。这对于输入已知的简单情况很好,并且不存在输入错误的可能性。但是一旦你遇到可能需要处理错误输入的情况,使用{{1}}会变得很痛苦,并且采用其他方法来解析基于流的输入要好得多。