多次将 cat 命令通过管道传递给 C++ 代码
piping a cat command to c++ code multiple times
如果我想用命令./run in.txt
多次读取一个文件,有一个直接的方法,
ofstream fin;
while (fin >> i) {…}
fin.clear(); fin.seekg(0);
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 ...
如果我想用命令./run in.txt
多次读取一个文件,有一个直接的方法,
ofstream fin;
while (fin >> i) {…}
fin.clear(); fin.seekg(0);
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 ...