2015-11-30 306 views
0

我使用QFileQTextStream先讀取文件,然後將未修改的讀取內容重新寫入同一個文件。下面是代碼:QTextStream readAll()刪除換行符

QFile inFile("file.txt"); 
if(!inFile.open(QFile::ReadOnly | QFile::Text)) 
{ 
    qCritical() << "ERROR: Unable to open input file: " << "file.txt"; 
    exit(1); 
} 
QTextStream inStream(&inFile); 
QString fileContents = inStream.readAll(); 
inFile.close(); 

QFile outFile("file.txt"); 
if(!outFile.open(QFile::WriteOnly | QFile::Text)) 
{ 
    qCritical() << "ERROR: Unable to open output file: " << "file.txt"; 
    exit(1); 
} 

QTextStream outSream(&outFile); 
outSream << fileContents; 
outFile.close(); 

然而,這種變換file.txt的如下:

1 
2 
3 
4 
5 

12345 

即在該過程中得到除去換行符。這是爲什麼發生?我怎樣才能防止它?

+0

它在Debian 8上按預期運行(不發生轉換,輸出看起來與輸入完全相同)。你用Windows嗎?也許不同的編解碼器用於閱讀和寫作!?在沒有'QFile :: Text'標誌的情況下試着避免解釋任何控制字符(「\ n」等)。 – Aaron

+0

如果可能,發佈兩個文件的十六進制轉儲。我們需要仔細瞭解線路終結器是什麼以及它們變成了什麼(假設它們不會完全消失)。 –

+0

適合我。有兩件事可以嘗試:首先,'qDebug()<< fileContents;'讀後(將幫助識別讀寫是否正在轉換字符);其次,寫入一個新文件,並轉儲 - 例如'od -c 33997523.txt'給我輸入和輸出文件的'1 \ n 2 \ n 3 \ n 4 \ n 5 \ n'。 –

回答

1

QIODevice::Text標誌傳遞給open()告訴Qt轉換Windows風格的行終結(\r\n)到C++ - 風格的終結(\n。 您是否在Windows?您應該能夠在輸入和輸出文件的二進制編輯器中看到\r\n

+0

但由於inFile和outFile都以相同的模式打開,所以生成的文件應該有CRLF行結束符。除非它們在原始文件中不是真正的CRLF行結束符。 –

+0

謝爾蓋,你是對的,它應該做的(我沒有看到輸出文件上的QIODevice :: Text。實際上,對於Windows 64位Qt5.5.1,它確實按預期工作。輸入的二進制轉儲是需要,可能只有\ n在輸入上,而不是\ r \ n。 – Jens

+0

我不認爲在輸入中只有'\ n'會完全刪除它。但也許這是一個古怪的文件與舊式只有Mac CR的新行(並且我不確定這些行將會中斷),或者在程序結束後如何打印文件有問題 –

0

關於QIODevice::Text在openMode官方文檔中說。

讀取時,行結束符被翻譯爲'\ n'。寫入時,行結束符會轉換爲本地編碼,例如Win32的「\ r \ n」。

它說Win32,而在Win64,Qt5.8上工作,我發現它的工作原理是不同的。 With QIODevice::Text in openMode,QIODevice::readAll()刪除全部'\r','\t'

並且談論\n,它們被\r代替,無論openMode使用什麼。 如果使用QIODevice::Text模式,可能會被刪除。