多次将 cat 命令通过管道传递给 C++ 代码

piping a cat command to c++ code multiple times

如果我想用命令./run in.txt多次读取一个文件,有一个直接的方法,

  1. ofstream fin;

  2. while (fin >> i) {…}

  3. fin.clear(); fin.seekg(0);

  4. while (fin >> i) {…}

但是,我想将压缩的输入文件通过管道传输到程序。命令是

bzcat file.bz2 | ./run

在代码中,我必须使用 std::cin.

而不是 ofstream fin

while (std::cin >> i) {…}

当 bzcat 将最后一行发送给程序时,循环终止。问题是,我怎样才能回到开始位置并告诉 bzcat 请再发送一次这些行(从第一个到最后)我将用 std::cin 捕获它们?!

管道内容在读取时被消耗,如果您需要多遍算法,您需要将这些值保留在内存中,您可以解压缩并运行文件,否则你可以将你的程序分成多个阶段,然后 运行 它们一个接一个地:

// 1
std::vector<int> data;
std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(),
          std::back_inserter(data));
// operate on data

#2
$ bunzip2 file.bz2 && ./run file.bz2

# 3
$ bzcat file.bz2 | ./stage1 | ./stage2 ...