reading a C++ ifstream twice?

reading a C++ ifstream twice?

本文关键字:twice ifstream C++ reading      更新时间:2023-10-16

如何使用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对象,后跟一些空换行符(并且再次重复可能是一个** someothername后跟另一个JSON对象等组成的文件......我需要一个两遍算法。第一遍是提取所有名称(如somename)并构建一些"空"命名的东西。第二遍是从 JSON 对象填充命名的东西,然后是它们。JSON 解析是使用最近的 1.5 jsoncpp库完成的。

到达流结束时对std::getline的最后一次调用失败,设置为 failbit 。由于设置了failbit,因此对seekg的调用不起作用。在调用seekgDEMO) 之前,您需要clear流的状态标志:

namespace {
void one_pass(std::istream& is) {
  std::string lin;
  for (int num = 0; std::getline(is, lin); ++num) {
    std::cout << '#' << num << ':' << lin << 'n';
  }
}
} // unnamed namespace
int main(int argc, char**argv)
{
  std::ifstream inp{argc > 1 ? argv[1] : __FILE__};
  std::cout << "first passn";
  one_pass(inp);
  inp.clear();
  inp.seekg(0);
  std::cout << "nsecond passn";
  one_pass(inp);
}