10

在 Windows 上这个

#include <stdio.h>

int main() { 
    putc('A',stdout);
    putc('\r',stdout); 
    putc('\n',stdout);
}

输出

A<CR><CR><LF>

如何在不自动转换为 CR LF 的情况下仅将 LF char 写入标准输出?

我需要它来使简单的套接字流阅读器成为标准输出。我尝试过 CodeGear、mingw、tinycc 中的 bcc32 都产生相同的结果,将 putc 更改为 putchar、fputc、fwrite 也无济于事。

4

3 回答 3

13

MSVC 解决方案是:

#include <io.h>
#include <fcntl.h>
...
_setmode(1,_O_BINARY)

其他运行时可能会提供 C99 解决方案或替代方式。编辑:我相信setmode([file number],O_BINARY)起源于 Borland Turbo C,其他 MS-DOS 和 Windows 编译器模仿它。_ 前缀是为了保持命名空间干净,在某些编译器上可能不存在。

于 2011-04-28T03:49:52.627 回答
3

文本文件将 C 字符'\n'转换为以输出结尾的本地行,并将以输入结尾的本地行转换为单个'\n'.

要获得所需的结果,您必须更改stdout为二进制文件流。

部分答案可在此处找到。如果您有符合 C99 的库,请使用:

if (freopen(0, "wb", stdout) == 0)
    ...oops...operation failed...

将尝试将标准输出更改为二进制流。但是,在 Windows 上,“符合 C99 的库”可能是个问题。名义上,这是可移植的(因为是标准的)答案。可能有一个特定于 Windows 的功能可以完成相同的工作。

于 2011-04-28T03:37:27.000 回答
3
#ifdef _WIN32
#include <fcntl.h>
#include <io.h>
#endif

#ifdef __BORLANDC__
#define _setmode setmode
#endif

#include <stdio.h>

static void binary_stdout(void) {
#ifdef _WIN32
    _setmode(_fileno(stdout), _O_BINARY);
#endif
}

int main(void) {
    binary_stdout();
    printf("\n");
    return 0;
}
于 2018-04-29T11:09:49.713 回答