我需要解析文件并获取失败位置(如果有的话)。如果设置了tellg()
,问题是failbit
无效。
是否有一种优雅的(内置?)方式来查找failbit
设置的位置?
使用clear()
和tellg()
是否有效?我无法确定流的状态(包括位置)是否保证在失败后保持有效
答案 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);
}