2015-08-08 19 views
1

我試圖實現我自己的日誌輪轉(創建新的日誌文件,每當文件大小達到10 MB)。讀取標準輸入,並將其寫入文件的部分是這樣的:作爲日誌輪到我的程序

fstream file("log.txt", ios::out | ios::app); 
while (std::cin >> lineInput) { 
    file << lineInput; 
} 

但問題是,管道的數據被破壞。標籤和新行總是丟失。因此,舉例來說,如果我的節目的名字是LogRotator,則命令:

ls | ./LogRotator 

只是串接所有的文件名字連在一起,就像這樣:

LogRotatormain.oMakefile 

ls輸出是:

LogRotator main.o Makefile 

我的問題:如何讓標準的流保存所有內容,包括製表符,換行符等等?

+2

您可能會忽略格式化的輸入/輸出並使用讀取/寫入(以及類似的)代替 –

回答

2

感謝DieterLücking的暗示,我找到了解決問題的方法。所以人們必須使用未格式化的讀取。以下工作正常:

fstream file("log.txt", ios::out | ios::app); 
while (getline(cin,lineInput,'\n')) 
{ 
    file << lineInput; 
} 
+0

究竟是什麼使得「未格式化」?它格式化完全不可移植,考慮到您使用純STL,這是驚人的。 – Blindy

+0

@ Blindy該函數不會執行任何字符串處理,也不會根據其內容判斷輸入(除非符合分隔符,但分隔符也隨文本一起提供)。它在閱讀時提供。其他處理如流式傳輸到'std :: cin'將會修改輸入一些時間。例如,它會將一個'\ n'改成一個新行。這是我的理解。 –

+0

它肯定沒有,流塊複製是通過'ifstream :: read'和'ofstream :: write'完成的。 'getline'和'operator <<'兩者都會更改您的數據,並且在操作系統上以操作系統爲基礎對其進行了全面記錄。 – Blindy