将数据从fstream复制到stringstream而没有缓冲区?

时间:2010-10-31 19:00:02

标签: c++ stl buffer fstream stringstream

我是否可以将数据从fstream(文件)传输到stringstream(内存中的流)?

目前,我正在使用缓冲区,但这需要双倍的内存,因为你需要将数据复制到缓冲区,然后将缓冲区复制到stringstream,直到你删除缓冲区,数据被复制到记忆。

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;`

有没有人知道如何在不使用中间缓冲区的情况下将整个文件写入字符串流?

5 个答案:

答案 0 :(得分: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));

答案 1 :(得分:23)

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

答案 2 :(得分:6)

ostream的文档中,有several overloads for operator<<。其中一个需要streambuf*并读取所有streambuffer的内容。

以下是一个示例用法(已编译和测试):

#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);
}

答案 3 :(得分:1)

使用C ++标准库的唯一方法是使用ostrstream而不是stringstream

您可以使用自己的char缓冲区构造一个ostrstream对象,然后它将取得缓冲区的所有权(因此不再需要复制)。

但是请注意,strstream标题已被弃用(尽管它仍然是C ++ 03的一部分,并且很可能,它将始终可用于大多数标准库实现),并且您将遇到大麻烦如果你忘记了null终止提供给ostrstream的数据。这也适用于流操作符,例如:ostrstreamobject << some_data << std::ends;std::ends null终止数据。)

答案 4 :(得分:0)

如果您使用的是 Poco,这很简单:

#include <Poco/StreamCopier.h>

ifstream ifs(filename);
string output;
Poco::StreamCopier::copyToString(ifs, output);