2009-04-08 105 views
2

這似乎只是把一個換行是足夠好,但我知道它應該是回車+換行。如果你不把回車並且只使用換行符,會發生什麼可怕的事情嗎?在Windows中打印到控制檯時需要回車嗎?

這是在ANSI C,不會被重定向到一個文件或其他任何東西。只是一個正常的控制檯應用

回答

2

Windows控制檯遵循假定用於文件的相同的行結束約定,或者針對實際的物理終端。它需要同時看到CR和LF才能正確移動到下一行。

也就是說,ANSI C程序和該控制檯之間有很多軟件基礎結構。特別是,任何標準的C庫I/O函數都會嘗試做正確的事情,假設你已經允許它有機會。這就是爲什麼fopen()tb修改符參數mode已定義。

隨着t(默認爲最流,並且尤其是用於stdinstdout)然後印刷任何\n轉換爲CRLF序列,而反向發生用於讀出。要關閉該行爲,請使用b修飾符。

順便提及,端子傳統上鉤住* nix的盒包括的XTerm仿真也需要CR和LF的DEC VT100。但是,在* nix世界中,從換行符到CRLF序列的轉換在tty設備驅動程序中處理,所以大多數程序不需要知道它,並且忽略修飾符。在這些平臺上,如果您需要在沒有修改的情況下在tty上發送和接收字符,則需要查看stty(1)或系統調用它所依賴的字符。

如果您的其他ANSI C程序正在避免C庫I/O到控制檯(可能是因爲您需要訪問控制檯的字符顏色和其他屬性),那麼您是否需要發送CR還是不取決於哪個Win32 API你用來發送字符的電話。

1

如果您處於* nix環境\ n(換行)可能沒問題。如果你在Windows中並且沒有重定向(現在),換行也可以,但是如果有人在某個點重定向,則: - (

如果你在做Windows,那麼如果輸出是重定向到一個文本文件,然後另一個進程嘗試消耗控制檯知道要顯示什麼數據。

,但消費者可能不快樂......

如果您正在使用C#,您可以嘗試的環境。 NewLine「constant」

http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx

如果你真的在香草c,你堅持\ r \ n。 :-)

+1

其實並非完全正確。 C運行時庫非常小心地爲ANSI C文件I/O做合理的轉換。這正是爲什麼'f`和`b`修飾符被'fopen()`發明的原因。標準流在文本模式下打開,除非您需要努力改變它們,並且管道和重定向按照Windows用戶的預期工作。如果直接調用Win32 API,那麼故事是不同的,但是你不再執行ANSI C I/O。 – RBerteig 2011-03-10 08:47:43

0

這取決於你正在使用他們的。如果您沒有同時輸入\r\n,某些程序將不會正確顯示換行符。

如果您試圖僅編寫\n某些使用您的文本文件(或輸出)的程序可能會將您的文本顯示爲單行而不是多行。

還有一些文件格式和協議,如果不同時使用\r\n,將會完全失效。

0

我還沒有嘗試過這麼久,我不確定我是否記得會發生什麼......但是沒有換行本身會在沒有返回到左列的情況下向下移動一行?

根據您的編譯器,標準輸出可能會以文本模式打開,在這種情況下,單個換行將在被寫出之前轉換爲\ r \ n。

編輯:我只是嘗試了一個快速測試,在XP中沒有返回的文件正常顯示。我仍然不知道是否有編譯器爲您插入回報。

0

在C中,文件(稱爲「流」)有兩種口味 - 二進制或文本。

這個區別的含義是左邊的實現/平臺依賴,但是在寫入文本流時,Windows(具有我見過的常見實現)會自動轉換爲「\ r \ n」,並且當從文本流中讀取「\ r \ n」時會自動轉換爲「\ n」。

「控制檯」實際上是「標準輸出」,它是一個默認打開的文本流。因此,在Windows上的實踐中,編寫「Hello,world!\ n」應該足夠 - 便攜。