You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++程序中获取通过重定向/管道传入的文件内容

嗨,我来帮你理清这个问题~

你用 ./main <filename.txt 或者 echo 文件内容 | ./main 这种方式传数据时,这些内容并不是命令行参数,所以肯定不会出现在 argv 里——argv 只负责存储你直接跟在程序名后面的参数(比如 ./main arg1 arg2 里的 arg1、arg2)。这种输入方式其实是把数据**通过标准输入(stdin)**传递给程序的,你需要从标准输入里读取内容来存储。

下面给你两种常用的实现方式:

方法1:用C++风格的iostream库(推荐)

这种方式更符合C++的编程习惯,代码也更简洁安全:

#include <iostream>
#include <string>
#include <vector>

int main() {
    std::string line;
    std::vector<std::string> input_content;

    // 逐行读取所有输入,直到输入结束
    while (std::getline(std::cin, line)) {
        input_content.push_back(line);
        // 你也可以在这里直接处理每一行内容,比如打印出来
        // std::cout << "读取到一行:" << line << std::endl;
    }

    // 现在input_content里就存储了所有传入的内容,后续可以按需处理
    std::cout << "一共读取了 " << input_content.size() << " 行内容" << std::endl;

    return 0;
}

如果你的输入是没有空格的单个字符串,也可以直接用 std::cin >> 变量名; 来读取,但要注意它会自动跳过空格、换行等空白字符。

方法2:用C风格的标准输入函数

如果你更习惯C语言的写法,也可以用 fgets 来实现:

#include <cstdio>
#include <vector>
#include <cstring>

int main() {
    char buffer[256];
    std::vector<char*> input_content;

    // 逐行读取,直到stdin结束
    while (fgets(buffer, sizeof(buffer), stdin) != nullptr) {
        // 去掉fgets自动读取的换行符(如果不需要可以省略这一步)
        buffer[strcspn(buffer, "\n")] = '\0';
        // 复制内容到动态分配的内存,避免buffer被覆盖
        char* line = new char[strlen(buffer) + 1];
        strcpy(line, buffer);
        input_content.push_back(line);
    }

    // 处理完记得释放动态分配的内存,避免内存泄漏
    for (auto line : input_content) {
        delete[] line;
    }

    return 0;
}

需要注意的是:不管是从文件重定向输入,还是通过管道传递内容,程序读取的都是标准输入,这两种方式对程序来说没有区别,你只需要专注于读取stdin的内容即可。

内容的提问来源于stack exchange,提问作者Prunus Persica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:10:11