2012-11-27 47 views
7

我有一些代碼使用ifstream從文件中讀取一些數據,並且一切正常。C++使用從內存中的ifstream

現在,我想,而不需要修改一些代碼,從存儲器讀取這些數據,其實我有一個char *包含數據...

我怎樣才能把我的char *數據爲ifstream沒有有效的閱讀文件?

+0

[設置標準流使用的內部緩衝區(pubsetbuf)]的可能的重複(http://stackoverflow.com/questions/1494182/setting-the-internal-buffer-used-by-a-standard-stream-pubsetbuf) –

回答

7

如果使用該ifstream&的代碼可以稍微改變,以使用istream&那麼你可以ifstreamistringstream之間容易地切換(用於從存儲器讀取的數據):

void read_data(std::istream& in) 
{ 
} 

來電者:

std::istringstream in_stream(std::string("hello")); 
read_data(in_stream); 

std::ifstream in_file("file.txt"); 
read_data(in_file); 
8

標準庫提供了一個可寫入的內存istreamstd::stringstream

你需要正確地抽象你的代碼,以便它接受通用的istream而不是ifstream,構造一個stringstream,用你的數據填充它並把它傳遞給函數。

例如:

const char* data = "Hello world"; 
std::stringstream str((std::string(data))); // all the parens are needed, 
              // google "most vexing parse" 

do_something_with_istream(str); // pass stream to your code 
6

雖然使用了std::istringstream(有時候也會引用i這個名字,但是這樣的類也存在,但是構建起來更昂貴,因爲它也設置了輸出流)非常受歡迎,我認爲這是值得的指出這至少使實際字符串的一個副本(我懷疑大多數實現甚至會創建兩個副本)。創建任何副本可以使用小型流緩衝來避免:

struct membuf: std::streambuf { 
    membuf(char* base, std::ptrdiff_t n) { 
     this->setg(base, base, base + n); 
    } 
}; 
membuf sbuf(base, n); 
std::istream in(&sbuf); 

對於記憶的差異可能無所謂雖然保存的分配可以noticable有一小塊區域,太。對於大塊內存來說,這是一個很大的區別。

0

在我的項目中,我使用iostream的write()和read()方法,因爲我將二進制數據寫入到一個stringstream中。對不起,下面的代碼沒有經過測試,並可能語法錯誤(從辦公室打字... ;-),但這樣的事情可以讓你寫入內存,文件和其他地方(如網絡套接字):

void foo(std::iostream *mystream) 
{ 
    mystream.write("Hello", 5); 
    uint32_t i=5302523; 
    mystream.write((char*) &i, sizeof i); 
} 

int main() 
{ 
    // Write to memory. stringstream's write() and read() work binary 
    std::stringstream memstream; 
    foo(&memstream); 

    // Write to file 
    std::fstream f; 
    try 
    { 
     f.open("file.dat"); 
     foo(&f); 
    } 
    catch (...) 
    { 
     // ... 
    } 

    if (f.is_open()) 
     f.close(); 

    return EXIT_SUCCESS; 
}