C ++读入文件只有数字(双打)

时间:2014-09-09 01:04:09

标签: c++ file stream double

我试图读取 中只包含数字的文件。如果符合该条件,我可以成功读取整个文件,但如果碰巧有一个字母,我需要返回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;,它就会返回到下一行,继续循环播放。

非常感谢任何帮助。

2 个答案:

答案 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;它适用于任何流而不仅仅是文件。

虽然这种方法听起来比首先在单词中读取单词更好,但我更喜欢在正常情况下使用该方法,因为您希望能够报告错误,因此您希望在错误中打印所读取的内容。