如何使用std :: ifstream读取文件两次(例如旧的两遍汇编器)?
我尝试了显而易见的方法。
我尝试了显而易见的方法。
#include <fstream>
#include <iostream>
#include <string>
int main(int argc, char**argv)
{
std::string path = argc>1?std::string{argv[1]}:std::string(__FILE__);
std::ifstream inp{path};
int num=0;
std::cout << "first pass" << std::endl;
do {
std::string lin;
std::getline(inp,lin);
if (inp.eof())
break;
num++;
std::cout << "#" << num << ":" << lin << std::endl;
} while (!inp.eof());
inp.seekg(0, inp.beg);
inp.sync();
std::cout << "second pass" << std::endl;
num=0;
do {
std::string lin;
std::getline(inp,lin);
if (inp.eof())
break;
num++;
std::cout << "##" << num << ":" << lin << std::endl;
} while (!inp.eof());
inp.close();
return 0;
}
而且它不起作用(第二个循环在无限循环)。
顺便说一下,在Linux/x86-64/Debian上使用GCC 4.9.2编译
细节说明
实际上,我正在尝试解析一个由类似** somename
的行组成的文件,后面是一个JSON对象,后面是一些空的新行(也许还会重复出现** someothername
,然后是另一个JSON对象等等)。我需要一个两遍算法。第一次遍历提取所有名称(如somename
),并构建一些“空”的命名事物。第二遍遍历从跟随它们的JSON对象中填充已命名的事物。使用最近的1.5 jsoncpp
库进行JSON解析。
inp.clear();
- P0Wifstream::eof()
来控制读取循环,而应该使用文件读取操作来控制循环。这样一旦读取失败,循环就会停止。 - NathanOliver