获取设置了failbit的流位置/ std :: ios :: failure被抛出

时间:2017-10-29 15:48:31

标签: c++ stream position

我需要解析文件并获取失败位置(如果有的话)。如果设置了tellg(),问题是failbit无效。

是否有一种优雅的(内置?)方式来查找failbit设置的位置?

UPD

使用clear()tellg()是否有效?我无法确定流的状态(包括位置)是否保证在失败后保持有效

2 个答案:

答案 0 :(得分:2)

您只需要clear信息流就可以使用tellg()

#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>

int main()
{
    std::ifstream infile("input.txt");

    std::vector<int> data{ std::istream_iterator<int>(infile), {} };

    infile.clear();
    std::cout << "failed at position: " << infile.tellg();
}

当然,这只适用于支持tellg(有意义)开始的流。例如,如果您尝试将其与std::cin而不是fstream一起使用,那么您将无法获得有意义的结果(在我测试的编译器中返回-1,但我看起来确定无法保证)。

答案 1 :(得分:1)

如果在处理异常时流已超出范围,则无法执行此操作。如果流仍在范围内,您可以clear failbit然后,如果需要,可以使用setstate重置failbit。

示例:

#include <iostream>
#include <sstream>

int main()
{
    std::stringstream test("10 20 thirty 40 50");
    test.exceptions(std::istream::failbit);

    try
    {
        int val;
        while (test >> val)
        {

        }
    }
    catch (...)
    {
        std::cout << "Went boom.\n";
    }
    test.clear();
    std::cout << test.tellg();
    // test.setstate(std::ios::failbit);
}