seekg()函数失败

时间:2012-06-29 15:37:10

标签: c++ std ifstream seekg

我正在尝试编写一些简单的代码,它将读取文本文件,但会读取第一行两次。我认为这就像这样简单

    std::ifstream file;
    file.open("filename", std::ios_base::in);
    std::string line;
    std::getline(file, line);
    // process line
    file.seekg(0, ios::beg);

    while (std::getline(file, line))
    {
        // process line
    }

但是,由于第一行未处理两次,因此搜索必须失败。知道为什么吗?

请注意:这不是我面临的问题,而是它的简化版本,以便不必粘贴多个类代码和多​​个功能。真正的问题涉及将文件指针传递给多个类中的多个函数。可以调用或不调用第一个函数并读取文件的第一行。第二个函数读取整个文件,但必须先调用seekg以确保我们位于文件的开头。

我刚使用上面的代码来简化讨论。

2 个答案:

答案 0 :(得分:3)

我没有回头开始并且两次阅读第一行,而是认为我会用以下方式处理事情:

std::ifstream file("filename");

std::string line;

std::getline(file, line);
process(line);

do { 
    process(line);
} while (getline(file, line));

目前,这假设process不会修改line(但如果需要,可以很容易为第一次调用制作额外的副本)。

编辑:根据编辑答案中的修改要求,听起来真的需要搜索。在这种情况下,在继续之前clear流可能是最干净的:

std::getline(file, line);
process1(line);

file.seekg(0);
file.clear();

process2(file);

答案 1 :(得分:2)

理想情况下,您的代码应如下所示:

std::ifstream file("filename"); //no need of std::ios_base::in

if ( file ) //check if the file opened for reading, successfully
{
   std::string line;
   if ( !std::getline(file, line) )
   {
        std::cerr << "read error" << std::endl;
        return;
   }

   // process line

   if ( !file.seekg(0, ios::beg) )
   {
        std::cerr << "seek error" << std::endl;
        return;
   }

   while ( std::getline(file, line) )
   {
      // process line
   }
}
else
{
   std::cerr << "open error" << std::endl;
}