我正在使用C ++将二进制数据打印到stdout,然后将其重定向到文件。
(我不想直接写入文件)。
但是,当我尝试打印值'0A'
时,我得到'0D 0A'
。 (这是我将输出复制到HexEdit时所看到的)。
根据我的判断,'0A'
是'新行'的ascii,因此cout会自动添加{{1>} '回车'。
我想要的是单独打印'0D'
。我怎么能这样做?
我的代码:
0A
我见过这个:Print new line to a text file without carriage return (CR) in windows但似乎没有帮助我。
答案 0 :(得分:1)
不确定你真的可以使用cout和<<
运营商而不会发生大规模攻击。这是因为当使用<<
时,cout会将所有数据视为文本数据,并根据需要执行适当的转换 - 包括在Windows平台上打印换行符时添加CR字符。
您需要使用cout的write
方法,而不是使用插入运算符<<
。 write
方法不会格式化您的数据,但使用起来会更加尴尬。
答案 1 :(得分:1)
您无法使用任何标准输出流或文件控制行结束。解决这个问题的唯一方法是freopen()
标准输出stdout
,打开模式为wb
或wb +`来控制底层格式,例如:
FILE* out = freopen("stdout.txt", "wb", stdout);
std::cout << "hello, world\n";
如果您只使用C ++流,您还可以使用适当打开的std::cout
的流缓冲区替换std::ofstream
的流缓冲区,例如:
std::ofstream file("stdout.txt", std::ios_base::out);
std::streambuf* coutbuf = std::cout.rdbuf(file.rdbuf());
std::cout << "hello, world\n";
...
std::cout.rdbuf(coutbuf);
您需要还原原始流缓冲区以避免在销毁期间使用std::cout
时出现问题:至少在退出main()
后流将被刷新。如果您可以接受内存泄漏,则可以直接使用动态分配的std::filebuf
。
上述解决方案实际上都没有将输出写入标准输出,它们都写入文件。我不知道如何在Windows系统上重新打开标准输出(在UNIX系统上,您要么使用文件描述符1
创建流缓冲区,但在UNIX上无论如何都不需要,因为{{1} }首先没有被替换)。特别是,重新打开流以适应输出重定向可能是不可能的。