2012-03-14 961 views
6

這是我的代碼:C++ ofstream的換行符

#include <iostream> 
#include <fstream> 
using namespace std; 
int main() 
{ 
    ifstream ifile ("input.dat", ios::in); 
    ofstream ofile ("output.dat",ios::out); 

    int num; 
    ifile >> num; 
    ofile << num; 
    ofile << endl; 
    ofile << "Did we go to new line?"; 
    ofile << endl; 

    return 0; 
} 

的問題是,一切都在output.dat是在同一條線上。我該如何解決這個問題?

謝謝!

編輯:我正在使用Windows來查看文件和Linux編譯。這就是我遇到這個問題的原因。在Linux端使用cat output.dat來查看文件內容會發現Windows與Linux換行符在當時是不同的。

+2

[C++ Ofstream new line](http://stackoverflow.com/questions/6352283/c-ofstream-a-new-line) – karlphillip 2012-03-14 16:30:06

+2

[Inconceivable](http://www.youtube.com) /手錶?v = 1-b7RmmMJeo)。你確定* output.dat只有一行嗎?你如何檢查?另外,你使用的是什麼操作系統和編譯器? – 2012-03-14 16:30:59

+0

我正在使用Windows和記事本來檢查輸出文件。 – 2012-03-14 16:32:14

回答

2

std :: endl已經插入了一個換行符,因此您的文件中有換行符。我假設你正在LF系統上生成你的文件(Linux或其他類UNIX)並在CRLF系統上查看它。在這種情況下,您的換行符不會在文本編輯器中顯示爲換行符。 unix2dos是你的朋友。

+0

我正在使用Windows和記事本來檢查輸出文件。 – 2012-03-14 16:32:32

+3

即使他在Unix下生成並在Windows下讀取,大多數編輯器都會正確顯示它。如果這是他的問題,那麼正確的解決方案是使用不同的編輯器;一個真正的Windows程序將輸出CRLF,但是對於輸入是不可知的(就像一個真正的Windows程序將輸出'\'作爲路徑分隔符,但同時接受'\'和'/')。 – 2012-03-14 16:36:07

+2

@ Pirate43記事本沒用。嘗試其他任何東西(甚至從控制檯窗口輸入「filename」)。 – 2012-03-14 16:41:09

5

std::endl替換爲"\r\n"以獲得CRLF而不是LF。

+5

我建議不要這樣做。除非你在Unix下編寫文件,並且你想要Windows行結束,否則沒有多少選擇。 (我想知道是否有人實現了一個'filebuf',它需要一個額外的格式化選項,以指定應該用於輸出的行結束約定。) – 2012-03-14 16:43:59

+0

@JamesKanze:的確,我完全同意,但似乎是這樣這裏發生了什麼。使用'filebuf'更好,我很想在這裏看到它。 – 2012-03-14 16:50:02

+0

@JamesKanze我懷疑我們的朋友是否可以達到這樣的程度,並且他有這麼廣泛的應用程序來讓他的代碼工作,他應該試試'filebuf'。 – 2012-03-14 16:52:19