将stdout重定向到Linux上的文件时,C ++程序无法生成输出

时间:2014-02-10 00:59:28

标签: c++ linux bash io-redirection

我正在尝试在计算机集群(运行Linux,CentOS 6)上运行下面的简单c ++程序。

#include <iostream>
#include <fstream>

int main(int argc, char *argv[]) {
    std::ofstream file;
    file.open("/dev/stdout");
    file << "Hello, world\n";
    file.close();
    return 0;
}

当我编译(使用g++ test.cpp)并在头节点上运行程序时,它可以正常工作,我是否让输出转到终端将其重定向到文件。也就是说,

$ ./a.out > myfile.txt

生成一个文件myfile.txt,其中包含“Hello,world”这一行(我正在使用bash)。如果我在任何执行节点上运行它并让输出到终端它就可以正常工作;但是,如果我尝试将输出重定向到文件,则文件始终为空。

我知道这不是用C ++编写hello world程序的“标准”方式。我实际上遇到了第三方程序的困难,该程序试图使用需要文件名的库将二进制数据写入标准输出。在尝试减少要发布的代码时,我发现上面是最简单的代码,可以重现我在更大的程序中看到的问题。

我不是一个经验丰富的C ++程序员,所以不知道上面的例子应该或不应该工作,但事实上它可以在某些计算机上运行,​​正如我所期望的那样而不是其他人,这让我很难过。我也不确定这是否与C ++代码,bash或系统配置有关。我问过这个问题的人似乎已经同样困惑,甚至无法建议从哪里开始寻找。

我用其他语言创建了简单的hello world程序,这些程序在执行节点上都按预期工作,所以我认为这是C ++特有的。

任何人都可以向我解释,或者帮助我确定为什么我在运行相同操作系统的机器上观察不同的行为(并且应该配置相同的),并且在C ++中有一种(首选)方式可以获得库函数需要文件名写入stdout?

2 个答案:

答案 0 :(得分:1)

我环顾四周,发现您正在使用的程序可能有甚么可能:uuencode。如果不是这样,请忽略整个答案。该程序看起来很难使用,因此我将概述我认为使用它的一种理智的方式:

将任何内容作为“输出文件名”提供给uuencode

uuencode mybinaryfile anything > mytextfile

然后将生成的“mytextfile”传输到运行

的新系统
uudecode mytextfile -o mynewbinaryfile

生成“mynewbinaryfile”。同样,这个程序的设计(特别是我作为“任何东西”传递的参数)并不是很好,并且在将二进制文件从一台机器移动到另一台机器时会出现字节序和类型大小的问题。我建议远离它。

至于解释,uudecode试图写入/ dev / stdout,在集群和HPC机器上,所有常见的住宿如/ dev / stdout都不再像它们看起来那样。

答案 1 :(得分:0)

嗯,可能问题出在mode的{​​{1}}参数上。

顺便说一句,执行配置输出是一种相当奇怪的方式......