我正在尝试编写一些简单的代码,它将读取文本文件,但会读取第一行两次。我认为这就像这样简单
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以确保我们位于文件的开头。
我刚使用上面的代码来简化讨论。
答案 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;
}