【发布时间】:2015-03-06 15:19:09
【问题描述】:
如何使用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;
}
它不起作用(第二个循环无限循环)。
FWIW,在 Linux/x86-64/Debian 上使用 GCC 4.9.2 编译
精度
实际上,我正在尝试解析一个文件,该文件由以下行组成...)。我需要一个两遍算法。第一步是提取所有名称(如somename)并构建一些“空”命名的东西。第二遍是从它们后面的 JSON 对象中填充命名的东西。 JSON 解析是使用最近的 1.5 jsoncpp 库完成的。
【问题讨论】:
-
清除不良标志可能是?
inp.clear(); -
“第二个循环无限循环”并打印什么?..
-
几个月前我就有这个问题了,看我的问答stackoverflow.com/questions/28331017/…
-
您不应该使用
ifstream::eof()来控制阅读循环。您应该使用文件读取操作来控制循环。这样一旦读取失败,循环就会停止。