【问题标题】:How to read data from an open pipe: example needed如何从打开的管道中读取数据:需要示例
【发布时间】:2015-03-08 16:34:23
【问题描述】:

谁能提供一个小例子或指导我阅读适当的阅读材料以解决以下问题:

    ls | ./myprog

我想要实现的是我的程序从 ls 读取信息,然后将其打印在屏幕上。

我需要 c++ 示例,如果可能的话,可以通过 boost lib 来实现

谢谢

附言

谢谢你的一切工作

【问题讨论】:

  • 不应该需要任何特别特别的东西——只要普通的while(std::cin >> myvariable) { ... } 或类似的就可以了。 “通用输入系统”的美妙之处在于管道、重定向文件和控制台的工作方式相同。
  • “管道”不是你程序的一部分,而是shell如何设置运行程序的环境。

标签: c++ linux pipe


【解决方案1】:

在 C 语言中,您需要做的就是read file descriptor 0

read(0, …, …);

在 C++ 中,您可以使用 std::cin

#include <iostream>
int main() {
    std::cin >> /* a variable you want to direct the input to */
    return 0;
}

这是与 boost 完全兼容的标准 C++。对于使用它的方式,我留给您阅读更多关于手册和您可以在网上找到的大量示例。


要打开从标准输入读取的文件,您可以按以下方式进行操作:

shared_ptr<istream> input;
if (filename == "-" || filename == "")
    input.reset(&cin, [](...){});
else
    input.reset(new ifstream(filename.c_str()));

// ...

(从https://stackoverflow.com/a/2159469/1290438复制的答案)

基本上,如果您不提供文件名参数,则您认为数据来自标准输入。这就是 cat 的工作方式。

【讨论】:

  • 谢谢!如果有时我想从文件中读取,有时从标准输入中读取,那将是一个解决方案。假设我只有一个循环,我需要一次读取一个输入字符(get()),然后我不能使用 cin。对吗?
  • 当然你一次读一个字符,只是你istreamread() method,它是cin的类,你可以给它读的字符数。但是你真的想要吗?如果您正在读取文件作为输入,您可能更喜欢逐行读取它。
【解决方案2】:

此代码完全符合您的问题:

#include <iostream>

using namespace std;

    int main()
{ 
while (true)
    {
        string x;
        cin >> x;
        cout << x << endl;
    }
}

您必须将此代码放入您的“myprog”cpp 文件中,然后键入您提到的命令。 它只是把 ls 程序的输入放到你的屏幕上

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多