2

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

    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 必须失败。知道为什么吗?

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

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

4

2 回答 2

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);
于 2012-06-29T15:53:15.967 回答
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;
}
于 2012-06-29T15:43:38.297 回答