2010-12-04 46 views
2

在我的previous問題中,我問如何從文件中讀取內存。因爲我的整個文件都在內存中,所以我想以類似的方式讀取它。如何從使用wistream的文件讀取內存?

我發現answer對我的問題,但實際上我需要讀行作爲wstring。用文件我可以這樣做:

wifstream file; 
wstring line2; 

file.open("C:\\Users\\Mariusz\\Desktop\\zasoby.txt"); 
if(file.is_open()) 
{ 
    while(file.good()) 
    { 
     getline(file,line2); 
     wcout << line2 << endl; 
    } 
} 
file.close(); 

即使文件是ASCII。

現在我只是簡單地將我的string行改爲wstringthis的函數回答。但是,我認爲如果有辦法像wistream那樣處理這塊內存,那麼將這條線路作爲wstrings是更快的解決方案。我需要這個快速。

因此,任何人都知道如何將這塊內存視爲wistream

回答

0

我假設你的數據已經被轉換成所需的編碼(請參閱@detunized answer)。

使用my answer to your previous question轉換是直截了當:

namespace io = boost::iostreams; 

io::filtering_wistream in; 
in.push(warray_source(array, arraySize)); 

如果insist on not using boost,則轉換出現如下(還是直線前進):

class membuf : public wstreambuf // <- !!!HERE!!! 
{ 
    public: 
     membuf(wchar_t* p, size_t n) { // <- !!!HERE!!! 
     setg(p, p, p + n); 
    } 
}; 

int main() 
{ 
    wchar_t buffer[] = L"Hello World!\nThis is next line\nThe last line"; 
    membuf mb(buffer, sizeof(buffer)/sizeof(buffer[0])); 

    wistream istr(&mb); 
    wstring line; 
    while(getline(istr, line)) 
    { 
     wcout << L"line:[" << line << L"]" << endl; 
    } 
} 

還要考慮this爲什麼使用純char UTF -8流。

1

您不能將ASCII字符串視爲UNICODE字符串,因爲它們包含的字符具有不同的大小。所以你必須做一些轉換到一個臨時緩衝區,然後使用這塊內存作爲你的流的輸入緩衝區。這就是你現在正在做的。

+0

但我可以在`wstring`上使用`wifstream`在ASCII文件中並加載行。我會說這是一個「即時」轉換。我的意思是我可以用`ifstream`讀取ASCII文件,然後將字符串轉換爲wstrings,但我想簡單地使用`wifstream`會更快更容易。 – 2010-12-04 14:32:09

+1

`wifstream`使用`codecvt`在幕後進行轉換。看來`stringstream`不知道該怎麼做。它在飛行中爲你做,並不意味着它更快。它是以角色爲基礎進行的,可能會涉及一些開銷。將所有內容進行批量轉換應該更快。 – detunized 2010-12-04 17:33:48

0

這應該是顯而易見的,如果你有stringistreamistringstream,所以你也有wstringwistreamwistringstream

istringstreamwistringstream都只是模板類basic_istringstream分別對於char和wchar的特化。

相關問題