2011-04-28 65 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