2010-12-03 50 views
5

我有簡單的文本文件加載到內存中。我想從內存中讀取,就像我會從這裏讀取光盤一樣:如何從使用iostream的文件讀取內存?

ifstream file; 
string line; 

file.open("C:\\file.txt"); 
if(file.is_open()) 
{ 
    while(file.good()) 
    { 
     getline(file,line);   
    } 
} 
file.close(); 

但我有文件在內存中。我在內存中有一個地址和這個文件的大小。

我必須做些什麼來達到與處理上面代碼中的文件相同的流暢度?

+0

請參閱:[如何讀取文件內容到istringstream](http://stackoverflow.com/questions/132358/how-to-read-file-content-into-istringstream/138645#138645 )和[更簡單的方法來創建交流記憶體從字符大小T - 沒有複製](http://stackoverflow.com/questions/2079912/simpler-way-to-create- ac-memorystream-from-char-size-t-without-copying-th/2080048#) – 2010-12-03 16:26:22

回答

2

我發現了一個可以在VC++上運行的解決方案,因爲Nim解決方案只適用於GCC編譯器(非常感謝,不過謝謝你的回答,我找到了幫助我的其他答案!)。

看來其他人也有類似的問題。我完全按照herehere

所以從一塊內存讀取只是想形成的IStream你必須這樣做:

class membuf : public streambuf 
{ 
    public: 
     membuf(char* p, size_t n) { 
     setg(p, p, p + n); 
    } 
}; 

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

    istream istr(&mb); 
    string line; 
    while(getline(istr, line)) 
    { 
     cout << "line:[" << line << "]" << endl; 
    } 
} 

編輯:如果你有「\ r \ n」新的生產線也爲稔寫道: :

if (*line.rbegin() == '\r') line.erase(line.end() - 1); 

我試圖把這個內存爲wistream。有人知道怎麼做這個嗎?我爲此詢問了單獨的question

4

您可以使用istringstream

string text = "text..."; 
istringstream file(text); 
string line; 

while(file.good()) 
{ 
    getline(file,line);   
} 
+0

你的意思是(i)stringstream? – Chubsdad 2010-12-03 14:06:04

+0

IIRC`istrstream`已棄用。 – 2010-12-03 14:08:33

+1

這要求將數據從字符串複製到字符串流緩衝區中。因此,@ybungalobill建議的Boost解決方案將會更快,但這種解決方案可以工作,並且不依賴於外部庫。 – jalf 2010-12-03 15:10:24

4

使用boost.Iostreams。具體basic_array

namespace io = boost::iostreams; 

io::filtering_istream in; 
in.push(array_source(array, arraySize)); 
// use in 
10

你可以不喜歡以下..

std::istringstream str; 
str.rdbuf()->pubsetbuf(<buffer>,<size of buffer>); 

,然後在getline通話使用它...

注:getline不懂DOS/UNIX的區別,所以\ r被包含在文本中,這就是我爲什麼喜歡它的原因!

char buffer[] = "Hello World!\r\nThis is next line\r\nThe last line"; 
    istringstream str; 
    str.rdbuf()->pubsetbuf(buffer, sizeof(buffer)); 
    string line; 
    while(getline(str, line)) 
    { 
    // chomp the \r as getline understands \n 
    if (*line.rbegin() == '\r') line.erase(line.end() - 1); 
    cout << "line:[" << line << "]" << endl; 
    } 
1

使用

std::stringstream 

它來操縱和讀取字符串,就像其他流的接口。

1

這是我會怎麼做:

#include <sstream> 

std::istringstream stream("some textual value"); 
std::string line; 
while (std::getline(stream, line)) { 
    // do something with line 
} 

希望這有助於!

相關問題