2014-02-27 62 views
1

我想知道如何将一个值传递给程序,如: cat somefile | MYPROGC传递cat返回值

somefile: 你好

$猫somefile | myprog

>你好

这是我试过的。

int main(int argc, char **argv) { 
    printf("%s", argv[1]); 
    return 0; 
} 

我怀疑这是复杂的,但我只是不知道如何。

P.S如果某些字符有点偏离,我的键盘就会断线。

+1

'cat'没有“返回值”,但输出到标准输出。你可以将它传递给你的应用程序*,但它会转到标准输入*。另外,决定你正在使用哪种语言。 IO代码通常在C和C++(您最初标记的*和C#*)之间不同。 – crashmstr

+0

@crashmstr对不起,这是为C我认为标题将足够清楚抱歉误导标签。 – d4nk1337sauce

+0

@crashmstr嗯......在我看来'猫'确实有一个返回值...例如'cat/tmp/nonexistent 2 >>/dev/null; echo $?'给了我'1' ...当然,当您声明时,'cat'输出使用进程的标准输出通道(无论是'stdout'还是'cout'或...),尽管... – twalberg

回答

5

如果你想你的榜样cat foo | bar工作,你需要从标准输入读取数据,例如:

#include <stdio.h> 

int main() 
{ 
    int ch; 
    while ((ch = getchar()) != EOF) 
    putchar(ch); 
} 

这个程序只是回应标准输入到标准输出的所有内容,所以

$ cat somefile | myprog 

将会打印hello。您不必解析argv中的任何内容,因为周围的外壳程序已经为您解析并在程序参数和管道之类的东西之间辨别。

+1

'ch'应该声明为'int'。 –

+0

@MartinR谢谢,错过了! – csl

+0

@csl甜蜜谢谢!并感谢argv的探索,也非常有帮助。 – d4nk1337sauce

3

你只需要从你的程序的标准输入中读取。

尝试使用cinscanf来读取一条线。

例如用于读取一行,并使用cin它打印出来:

#include <iostream> 

int main() 
{ 
    std::string s; 
    std::getline(std::cin, s); 
    std::cout << s << std::endl; 

    return 0; 
} 
+1

这不会读取一行,而是一个以空格分隔的字符串。你需要'getline'来读取一行。 – crashmstr

+0

谢谢,修复它。 – MondKin

2

这里,你可能想在这里哪几个选项:

  • 你想要的文件名“somefile”传递给你的程序。

    $ myprog somefile argv参数阵列 - 这样你就可以在argv[1]

  • somefile访问 'somefile' 包含像 “Hello World” 的

    $ cat somefile | xargs myprog

    现在'的参数列表你好“和”世界“将分别在argv[1]argv[2]。这类似于调用你的程序myprog hello world

  • 您想要读取文件内的管道内容(文件内容)。

    正如其他人所说,你只是从标准输入读数。管道有效地将前一个命令的stdout附加到以下命令的stdin。

+0

哇,不是我想要的东西,但非常有用,它工作得很好。我从来没有真正使用过xargs,我必须仔细研究它 – d4nk1337sauce