【问题标题】:c++: how to print new line without carriage return [duplicate]c ++:如何在没有回车的情况下打印新行[重复]
【发布时间】:2012-01-22 11:04:15
【问题描述】:

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

我正在使用 C++ 将二进制数据打印到标准输出,然后将其重定向到文件。 (我不想直接写入文件)。 但是,当我尝试打印值'0A' 时,我得到'0D 0A'。 (这是我将输出复制到 HexEdit 时看到的)。 据我所知,'0A' 是“新行”的 ascii,因此 cout 会自动添加 '0D',即 “回车”。 我想要的是单独打印0A。我该怎么做?

我的代码:

unsigned char *buf = new unsigned char[width+1];
for (int x = 0; x < width; x++) 
{
    buf[x] = (unsigned char) src[x];
}
buf[width] = '\0'
cout<<buf; 

我见过这个:Print new line to a text file without carriage return (CR) in windows,但它似乎对我没有帮助。

【问题讨论】:

  • 为什么你提到的链接对你没有帮助?
  • @Lol4t0:链接指向一个 C 问题,而不是 C++ 问题。
  • 这并不重要,问题是TS应该以二进制模式重新打开stdout
  • 谢谢大家。我最终做的是使用 _setmode 将标准输出的模式设置为二进制。 fd_stdout = fdopen (1,"wb"); _setmode( _fileno( stdout ), _O_BINARY ); 然后我使用 fwrite 将我的二进制数据写入标准输出 fwrite(reinterpret_cast&lt;char*&gt;(buf), width, 1, fd_stdout);

标签: c++ printing carriage-return


【解决方案1】:

不确定您是否真的可以使用 cout 和 &lt;&lt; 运算符而无需大量破解。这是因为在使用 &lt;&lt; 时,cout 会将所有数据视为文本数据,并将根据需要执行适当的转换——包括在 Windows 平台上打印换行符时添加 CR 字符。

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

http://www.cplusplus.com/reference/iostream/ostream/write/

【讨论】:

  • 即使在使用write() 时,\n 也会被替换为行尾序列。转换要么在流缓冲区级别完成,要么通过系统调用在系统上完成。
  • 我做了以下事情:cout.setf(std::ios_base::binary); cout.write((const char*)buf, width);我仍然得到回车。
【解决方案2】:

您无法使用任何标准输出流或文件来控制行序列的结束。解决这个问题的唯一方法是 freopen() 标准输出 stdoutwb 或 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 上无论如何都不需要,因为 \n 没有首先被替换)。特别是,重新打开流以适应输出重定向可能是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2017-02-22
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    相关资源
    最近更新 更多