c ++:如何在没有回车的情况下打印新行

时间:2012-01-22 11:04:16

标签: c++ printing carriage-return

  

可能重复:
  How to make cout behave as in binary mode?

我正在使用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但似乎没有帮助我。

2 个答案:

答案 0 :(得分:1)

不确定你真的可以使用cout和<<运营商而不会发生大规模攻击。这是因为当使用<<时,cout会将所有数据视为文本数据,并根据需要执行适当的转换 - 包括在Windows平台上打印换行符时添加CR字符。

您需要使用cout的write方法,而不是使用插入运算符<<write方法不会格式化您的数据,但使用起来会更加尴尬。

http://www.cplusplus.com/reference/iostream/ostream/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} }首先没有被替换)。特别是,重新打开流以适应输出重定向可能是不可能的。