【问题标题】:Trying to feed a gz file to a c++ program试图将 gz 文件提供给 c++ 程序
【发布时间】:2026-01-23 04:35:02
【问题描述】:

我有一个带有一些命令行选项的 c++ 程序。其中之一是文件名。文件很大,所以我决定压缩它,然后尝试找到一种方法让 c++ 程序读取压缩文件而不是纯文本文件。

根据How to read a .gz file line-by-line in C++?这里所说的,我尝试了第二个答案,但它不起作用。

假设运行我的程序的正常命令行是

 ./run 1 file.txt 10

现在我跑了

 zcat file.gz | ./run 1 file.gz 10

但是输出无效。我该如何解决?

附注:

文件看起来像

10 1000
2   39
45 124

读取文件的代码看起来像

char *inp = argv[2];
std::ifstream fin (inp);
int a, b;
while (fin >> a >> b ) {
   // somthing
}

【问题讨论】:

  • 你能改变你的程序,让它从 STDIN 读取而不是打开给定的文件名吗?
  • 什么意思?使用 STDIN,我必须以交互方式输入。正确的?请查看更新后的帖子
  • zcat 在其 STDOUT 上生成输出。管道| 将此转发到您的进程的标准输入。这就是管道的作用。
  • 好的,我明白了。那么我怎样才能改变程序来满足这种需求呢?可以回复一下吗?

标签: c++ command-line gzip


【解决方案1】:

在您的情况下,最简单的直接解决方法是更改​​此设置:

char *inp = argv[2];
std::ifstream fin (inp);
int a, b;
while (fin >> a >> b ) {
  // something
}

进入这个:

char *inp = argv[2];
int a, b;
while (std::cin >> a >> b ) {
  // something
}

我已将 fin 替换为 std::cin。如果你还没有这样做,你需要#include <iostream>

这将从 STDIN 读取,这是管道 | 发送 zcat 输出的地方。

如果你想保留两个版本——一个从文件读取,一个从 STDIN 读取——你可以使用命令行参数来指示你正在从 STDIN 读取,然后在区分这两种用法的代码。

【讨论】: