c++ - print - ¿Copiar datos de fstream a stringstream sin búfer?
stringstream c# (4)
¿Hay alguna forma de que pueda transferir datos de un fstream
datos (un archivo) a un stringstream
(un flujo en la memoria)?
Actualmente, estoy usando un búfer, pero esto requiere el doble de memoria, ya que necesita copiar los datos en un búfer, luego copiar el búfer en la cadena de caracteres y, hasta que elimine el búfer, los datos se duplican en la memoria.
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;`
¿Alguien sabe cómo puedo escribir un archivo completo en una cadena sin utilizar un búfer intermedio?
En la documentación para ostream
, hay varias sobrecargas para el operator<<
. Uno de ellos toma un streambuf*
y lee todos los contenidos del streambuffer.
Aquí hay un ejemplo de uso (compilado y probado):
#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);
}
La única manera de usar la biblioteca estándar de C ++ es usar una ostrstream
lugar de una stringstream
.
Puede construir un objeto ostrstream
con su propio búfer de caracteres, y tomará posesión del búfer en ese momento (por lo que no es necesario copiarlo más).
Sin embargo, strstream
cuenta que el encabezado de la strstream
está en desuso (aunque aún es parte de C ++ 03, y lo más probable es que siempre esté disponible en la mayoría de las implementaciones de bibliotecas estándar), y tendrá grandes problemas si se olvida de terminar por completo los datos suministrados a ostrstream. Esto también se aplica a los operadores de flujo, por ejemplo: ostrstreamobject << some_data << std::ends;
( std::ends
nullterminates los datos).
// 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));
ifstream f(fName);
stringstream s;
if (f) {
s << f.rdbuf();
f.close();
}