2011-04-28 67 views
4

在Windows上C如何将LF输出到标准输出而不改变为CR LF?

#include <stdio.h> 

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

输出

A<CR><CR><LF> 

怎么写只是LF字符,它自动转换为CR LF到标准输出?

我需要它使简单的套接字流阅读器标准输出。 我试过bcc32从CodeGear,mingw,tinycc都产生相同的结果,改变putc到putchar,fputc,fwrite也没有帮助。

回答

10

的MSVC解决方法是:

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

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

+0

但它不支持传递'NULL'作为文件名,并且您开始的stdout不一定具有_have_文件名。 – Random832 2011-04-28 04:01:22

+0

谢谢。它可以工作,即使没有包含在tinycc和mingw中的io.h。必须包含在bcc32 io.h中,然后将_setmode更改为setmode。 – 2011-04-28 05:03:39

+0

从Windows 10(至少)开始,这是不够的。控制台执行自己的翻译,应该通过设置DISABLE_NEWLINE_AUTO_RETURN控制台模式分别禁用。 (该常量在Windows 10 SDK中定义,但不在Windows 8 SDK中定义) – AnT 2018-01-24 09:15:55

1

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

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

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

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

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

+0

使用'freopen函数()'。 – 2011-04-28 03:39:25

+0

@Ignacio:是的,谢谢 - 发现了......我们活着,我们学习,我们回答问题。 – 2011-04-28 03:44:56

+0

@James:从版本7 Unix开始,'freopen()'函数已经在''中,但是文件名的空指针行为在C99中是新的。 C89标准没有提及空指针。 – 2011-04-28 04:10:40

0

只输出LF性格,就像这样:putc('\x0A', stdout)

+0

大概你记得''\ x0A''; ''\ 0x0A'表示法是一个多字符常量,实际上包含4个字符 - NUL,x,0,A。结果是实现定义的(因此您可以确定它的可靠性,但它可以不同平台到平台,或在单个平台上的编译器之间)。 – 2011-04-28 04:27:30

+0

乔纳森,谢谢,我纠正了。 – qrdl 2011-04-28 04:47:38