2010-10-31 57 views
15

反正我可以從一個fstream(文件)(在內存中的數據流)傳輸數據到stringstream將數據從fstream複製到沒有緩衝區的串流中?

目前,我正在使用緩衝區,但這需要將內存翻倍,因爲您需要將數據複製到緩衝區,然後將緩衝區複製到字符串流,直到刪除緩衝區,數據纔會被複制在記憶中。

std::fstream fWrite(fName,std::ios::binary | std::ios::in | std::ios::out); 
    fWrite.seekg(0,std::ios::end); //Seek to the end 
    int fLen = fWrite.tellg(); //Get length of file 
    fWrite.seekg(0,std::ios::beg); //Seek back to beginning 
    char* fileBuffer = new char[fLen]; 
    fWrite.read(fileBuffer,fLen); 
    Write(fileBuffer,fLen); //This writes the buffer to the stringstream 
    delete fileBuffer;` 

有誰知道我怎麼能寫一個整個文件到一個stringstream而不使用inbetween緩衝區?

+0

有什麼意義?您是否在嘗試提高吞吐量?在這種情況下,你可能需要拋棄'fstream',iostreams很慢。你想減少你的內存佔用?一次讀取文件而不是一次讀取文件可以幫助解決這個問題。 – 2010-10-31 19:17:47

回答

25
// need to include <algorithm> and <iterator>, and of course <fstream> and <sstream> 
ifstream fin("input.txt"); 
ostringstream sout; 
copy(istreambuf_iterator<char>(fin), 
    istreambuf_iterator<char>(), 
    ostreambuf_iterator<char>(sout)); 
+0

這仍然將文件讀入'ifstream'緩衝區。 – 2010-10-31 19:11:20

+0

它比原始代碼少一個緩衝區。 – 2010-10-31 19:15:50

+0

@Charles - 儘管如此,我認爲這是他的意圖。他不想分配新的char數組。他想直接從fstream對象讀取到stringstream對象。 – 2010-10-31 19:17:15

20
ifstream f(fName); 
stringstream s; 
if (f) { 
    s << f.rdbuf();  
    f.close(); 
} 
1

使用C++標準庫的唯一方法是使用的ostrstream代替stringstream

您可以構建一個ostrstream對象與自己的字符緩衝區,這將需要緩衝區的所有權,然後(所以不需要更多的複製)。

但是請注意,strstream標頭已被棄用(雖然它仍然是C++ 03的一部分,並且很可能它在大多數標準庫實現中始終可用),並且如果您忘記了,則會遇到大麻煩到空終止提供給ostrstream.This數據也適用於該流的運營商,例如:ostrstreamobject << some_data << std::ends;std::ends nullterminates中的數據)。

7

在爲ostream的文檔,有several overloads for operator<<。其中一個需要streambuf*並讀取所有流緩衝區的內容。

下面是一個簡單的使用(編譯和測試):

#include <exception> 
#include <iostream> 
#include <fstream> 
#include <sstream> 

int main (int, char **) 
try 
{ 
     // Will hold file contents. 
    std::stringstream contents; 

     // Open the file for the shortest time possible. 
    { std::ifstream file("/path/to/file", std::ios::binary); 

      // Make sure we have something to read. 
     if (!file.is_open()) { 
      throw (std::exception("Could not open file.")); 
     } 

      // Copy contents "as efficiently as possible". 
     contents << file.rdbuf(); 
    } 

     // Do something "useful" with the file contents. 
    std::cout << contents.rdbuf(); 
} 
catch (const std::exception& error) 
{ 
    std::cerr << error.what() << std::endl; 
    return (EXIT_FAILURE); 
} 
相關問題