如何将C输出LF输出到标准输出而不更改为CR LF?

时间:2011-04-28 03:33:26

标签: c windows line-endings newline

在Windows上

#include <stdio.h>

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

输出

A<CR><CR><LF>

如何在不自动转换为CR LF的情况下将LF char写入stdout?

我需要它来制作简单的套接字流读取器到stdout。 我尝试过来自CodeGear的bcc32,mingw,tinycc都会产生相同的结果,将putc改为putchar,fputc,fwrite也无济于事。

3 个答案:

答案 0 :(得分:11)

MSVC解决方案是:

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

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

答案 1 :(得分:2)

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

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

找到部分答案here。如果您有一个符合C99的库,请使用:

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

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

答案 2 :(得分:1)

#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;
}