从失败的读取中恢复 ifstream

Recover ifstream from failed read

提问人:Ryan Moeller 提问时间:7/19/2019 更新时间:7/19/2019 访问量:88

问:

我目前有一段代码,它使用 ifstream 从文件中读取文本。此文件的每一行对应于必须编码到结构中的不同数据段。我的“encodeLine”函数负责解决这个问题。

为了安全起见,我希望我的系统能够处理太大而无法容纳其变量的数据。例如,如果将数字 999999999 读入短片中,我希望程序能够继续读取其余行。

目前,当我遇到这样的数据时,我会打印出“ERROR”并清除流。但是,当我执行更多读取时,读取的数据已损坏。例如,在下一行中,应读取数字“1”,但应读取类似 27021 的内容。

如何重置 ifstream 以继续有效读取?

这是我的代码:

ifstream inputStream;
inputStream.open(foo.txt);
char token[64];

int totalSize = 0;

// Priming read
inputStream >> token;

while(inputStream.good())
{
    // Read and encode line of data from file
    totalSize = totalSize + encodeLine(inputStream, &recordPtr, header, filetypeChar)

    if(!inputStream.eof() && !inputStream.good())
    {
         printf("ERROR");
         inputStream.clear();
    }
    else if(inputStream.eof())
    {
         break;
    }

    inputStream >> token;
}
C++ IOstream IFStage

评论

0赞 user4581301 7/19/2019
坏数据留在流中,通常需要 d。一个更好的技巧,当它有意义时,是从文件中读取整个记录而不解析它。将此记录馈送到 a 中并解析 istringstream。如果爆炸,文件仍然完好无损,并指向下一条记录。ignorestd::istringstreamistringstream
0赞 user4581301 7/19/2019
旁注:仅当程序读取超过文件末尾时,才会设置 eof。根据你的写作方式,你可能会给自己带来麻烦。如果您读取了部分记录并点击了文件的末尾,则会留下不完整的记录,直到以后您才会注意到。当文件恰好在记录末尾结束时,会发生另一个常见的故障。程序将读取最后一条记录,而不是找到 eof,循环并在尝试读取下一条记录时立即失败。encodeLine

答: 暂无答案