2015-04-23 107 views
0

我使用seekg和tellg找到了長度,然後將它們讀取爲無符號字符*。調試器顯示不正確的文本。如何從文本文件中讀取非ASCII字符

ifstream is (infile, ifstream::binary); 
//find length 
is.seekg (0, is.end); 
int length = is.tellg(); 
is.seekg (0, is.beg); 

char * buffer = new char [length]; 
is.read (buffer,length); 
//delete[] buffer; removed 

//size_t cipherTextLength = length;        removed  

//unsigned char* cipherText = new unsigned char[cipherTextLength]; removed 

//is.read (reinterpret_cast<char*>(cipherText),length);   removed 

編輯:

文本文件是這樣的:

.l F4"w2ÍögPl Ð l œ›」 ÿÿÿPl (goes on) 

調試器顯示是這樣的:

ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««þîþîþîþ 

編輯:現在文本文件只顯示. l和調試器顯示.\xl

+5

你打電話給'is.read()'來獲取整個文件,把它扔掉,然後想知道爲什麼下一次讀取嘗試什麼都不做。 ..?它已經在文件的末尾,並且'.eof()'爲true。無論如何,這可能是一個更好的主意[將整個文件內容讀入std :: string](http://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring?rq= 1) - 它們在析構函數中釋放內存,處理二進制內容就好了,並且有許多有用的函數來幫助您查詢和操作它們。 –

+0

@TonyD泰勒麥克亨利的解決方案都只讀取文件,直到無。 –

+1

@ atsay714你可以修正你的例子,所以你不是從'ifstream'兩次閱讀嗎?這應該工作。話雖如此,你應該使用TonyD鏈接的解決方案之一,所以你不需要手動管理內存。 'istreambuf_iterator'應該讀取直到到達EOF,直到第一個NUL字符。你是否以二進制模式打開文件? – Praetorian

回答

0

我認爲你並沒有將\0添加到緩衝區。我確實面臨同樣的問題,並通過adding+1來解決它的長度。

char *buffer = new char [length + 1]; 
buffer[length] = 0; // Adding terminating character in content. 
iFileStream.read(buffer, length); 
std::string str(buffer); 

現在str應該是正確的。希望這可以幫助。

0

由於你的代碼if.read可以得到二進制文件。你的程序是字符串輸出除外。你可以在緩衝區中使用%c來打印字符