reading a C++ ifstream twice?
reading a C++ ifstream twice?
如何使用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
的调用不起作用。在调用seekg
(DEMO) 之前,您需要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);
}
相关文章:
- ifstream什么都没读
- ifstream文件在从行中读取时被清除
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 将 ifstream 拆分为 n 个流?
- 如何将 std::ifstream 转换为 std::basic_istream<CharT, Traits>&?
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 是否可以在没有真实文件的情况下创建 ifstream
- 虽然循环不读取整个 ifstream 文件
- std::ifstream 在读取文件中最后一项时设置 eofbit,但仅在读取数值类型时发生
- Ofstream和IFSTREAM有什么区别?
- 如何将QByteArray转换为std::istream或std::ifstream?
- ifstream 跳过数字,只写 0
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 在函数中声明的 ifStream 对象在发布模式下不起作用
- fstream / ifstream / ofstream 对象如何转换为布尔值
- ifstream 尝试读取 9 到 13 之间的无符号字符时非常奇怪的行为
- 尝试在 C++ 中为 ifstream 提供一个变量
- ifstream 读取的字符与文件中写入的字符不同
- reading a C++ ifstream twice?