我试图读取 中只包含数字的文件。如果符合该条件,我可以成功读取整个文件,但如果碰巧有一个字母,我需要返回false并带有错误语句。
问题是我发现我的程序在找到此字符时很难出错。它可以发现它没问题,但是当它发生时,它决定跳过它。
我的代码在文件中读取并尝试仅读取数字:
bool compute::Read (ifstream& stream)
{
double value;
string line;
int lineNumber = 1;
if (stream)
{
while (getline(stream, line))
{
lineNumber++;
istringstream strStream(line);
while (strStream >> value)
{
cout << value << endl;
}
}
}
return true;
}
我用于此的输入文件是
70.5 61.2 A8 10.2
2
请注意,我的输入文件中有一个非数字字符。它应该失败并在那时返回false。
目前,只要它击中&#34; A&#34;,它就会返回到下一行,继续循环播放。
非常感谢任何帮助。
答案 0 :(得分:1)
stringstream 会捕获这些错误,但是当找到错误时,您无法阻止封闭循环继续。您需要定制主循环,以便在stringstream发现错误时停止,如果在每次迭代时重构字符串流,则无法执行此操作。您应该创建一个for()
循环,并在声明部分中构造stringstream。并且循环的条件应该是“只要字符串流和stream
没有捕获错误”。例如:
for (std::istringstream iss; iss && std::getline(stream, line);)
{
iss.clear();
iss.str(line);
while (iss >> value)
{
std::cout << value << '\n';
}
}
此外,如果您只想打印每个值,则看起来不需要使用std::getline()
或std::istringstream
。只是做:
while (stream >> value) {
std::cout << value << '\n';
}
当找到double
的无效字符时,上述内容将停止。
答案 1 :(得分:0)
您需要代码停止流式处理,但如果尚未到达&#34;输入&#34;的结尾,则返回false。
一种方式,可能不是最有效但仍然是单向的方法,一次解析一个词。
如果您首先阅读std::string
并且它是否有效(因此该字符串不为空)从该字符串创建istringstream
,或重用现有字符串,并尝试将其流式传输到{ {1}}值。
如果失败,则表示您的字符无效。
当然,您可以从文件中一次读取一行,然后将其拆分为单词,这样您就可以输出一条有意义的错误消息,显示坏文本被找到的行。
直接阅读双打的问题是当流到达文件末尾时流将失败。
但是也可以解决这个问题,因为失败的原因有一个错误状态,您可以检查,即您可以检查是否设置了double
。虽然eofbit中的f代表&#34; file&#34;它适用于任何流而不仅仅是文件。
虽然这种方法听起来比首先在单词中读取单词更好,但我更喜欢在正常情况下使用该方法,因为您希望能够报告错误,因此您希望在错误中打印所读取的内容。