gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:14:27 29 4
gpt4 key购买 nike

我正在尝试在计算机集群(运行 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 程序的“标准”方式。我实际上在尝试使用需要文件名的库将二进制数据写入标准输出的第 3 方程序时遇到了困难。在尝试减少要发布的代码时,我发现上面是最简单的代码,它重现了我在更大的程序中看到的问题。

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

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

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

最佳答案

我环顾四周,发现您正在使用的程序可能是也可能不是:uuencode .如果不是这样,请忽略整个答案。该程序看起来很难使用,所以我将概述我认为合理的使用方法:

给 uuencode 任何东西作为“输出文件名”

uuencode mybinaryfile anything > mytextfile

然后将生成的“mytextfile”传输到您运行的新系统

uudecode mytextfile -o mynewbinaryfile

产生“mynewbinaryfile”。同样,这个程序的设计(尤其是我作为“任何东西”传递的论点)不是很好,并且在将二进制文件从一台机器移动到另一台机器时存在字节序和类型大小的问题,这个程序忽略了。我建议远离它。

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

关于将 stdout 重定向到 Linux 上的文件时,C++ 程序无法生成输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21667400/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com