2011-02-10 38 views
2
std::wifstream theFileHandle; 
std::wstring theData; 
theFileHandle.open(theFile.Name()); 
theFileHandle >> theData; 
theFileHandle.close(); 

誰能告訴我爲什麼我的字符串(海圖)只從文件(theFile)獲得的第一個字???我希望字符串包含文件中的所有文本,包括空白和新行,有沒有人有這方面的建議?謝謝。爲什麼沒有>>正常工作C++?

PS。我需要將數據完美保存。謝謝。

+4

我可以保證``>>運營商實際上是在正常工作。的[閱讀整ASCII文件到C++的std :: string] – 2011-02-10 01:00:26

+0

可能重複(http://stackoverflow.com/questions/2602013/read-whole-ascii-file-into-c-stdstring) – 2011-02-10 01:10:33

+0

重新您的PS「需要數據要完美保存「,一個C++寬的流**可能不會做你認爲它的**。它將文件解釋爲窄字符(例如,在Windows中爲ANSI)併爲您提供相應的寬字符(例如,Unicode)。它可能在UTF-8編碼文件的* nix中工作,我不知道,但在Windows中,如果文件是Unicode,那麼你會得到垃圾。是的,這很愚蠢。是的,幾乎不可能爲該設計考慮任何合理的基本原理。不,這不是微軟的錯,它是C++ iostreams的設計。一個解決方法是讀取二進制數據,並翻譯自己。歡呼聲, – 2011-02-10 01:48:59

回答

4

你只是得到第一個詞的原因是,這正是>>運算符應用於字符串時的工作原理 - 它只是從跳過的任何流中獲取第一個以空格分隔的令牌領先的空白。

如果你想讀取文件的全部內容,您可以使用getline功能是這樣的:

std::wifstream theFileHandle; 
theFileHandle.open(theFile.Name()); 

std::wstringstream data; 
for (std::wstring line; getline(theFileHandle, line);) 
    data << line << L"\n"; 

std::wstring theData = data.str(); 

這個循環,而更多的數據可以通過getline訪問,因此,拉從所有數據文件。由於getline跳過換行符,這種方法還增加了新行早在

編輯:正如@PigBen指出的那樣,有一個更清潔的方式做到這一點使用rdbuf()

std::wifstream theFileHandle; 
theFileHandle.open(theFile.Name()); 

std::wstringstream data; 
data << theFileHandle.rdbuf(); 

std::wstring theData = data.str(); 

這使用流插入操作符被重載以接收流緩衝區的事實。這種情況下的行爲是讀取流緩衝區的全部內容,直到所有數據都耗盡爲止,這正是您想要的行爲。

1

那怎麼>>應該工作。它從輸入流中提取格式化數據。你想要.read()提取未格式化的數據。

多看這裏:http://www.cplusplus.com/reference/iostream/istream/read/

例如爲:

std::wifstream theFileHandle; 
wchar_t theData[SOME_LARGE_VALUE]; 
theFileHandle.open(theFile.Name()); 
theFileHandle.read(theData, sizeof(theData)); 
theFileHandle.close(); 
1

用於讀取整個文件,並有效地做一個簡潔的方式請參見優秀previous answer

3

operator>>對於字符串的定義與%sscanf轉換的工作幾乎相同,該轉換隻能讀取直到遇到空白爲止。

有許多的讀取整個文件轉換成字符串的方式。最簡單的可能是:

std::wstringstream buffer; 
buffer << theFileHandle.rdbuf(); 
theData = buffer.str(); 

如果你正在處理一個大文件,至少有一種方法明顯更快。在我之前發佈的答案中看到Test Four(但該代碼是Martin York的,不是我的)。

相關問題