Ok, aquí hay un código que describe lo que estoy tratando de hacer.Copia de una transmisión estándar a otra de manera eficiente
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <iostream>
#include <sstream>
int main(int c, char *v[])
{
int fd = open("data.out", O_RDONLY | O_NONBLOCK);
std::cout << "fd = " << fd << std::endl;
char buffer[ 1024000 ];
ssize_t nread;
std::stringstream ss;
while(true)
{
if ((nread = read(fd, buffer, sizeof(buffer) - 1)) < 0)
break;
ss.write(buffer, nread);
while(true)
{
std::stringstream s2;
std::cout << "pre-get : " <<
(((ss.rdstate() & std::ios::badbit) == std::ios::badbit) ? "bad" : "") << " " <<
(((ss.rdstate() & std::ios::eofbit) == std::ios::eofbit) ? "eof" : "") << " " <<
(((ss.rdstate() & std::ios::failbit) == std::ios::failbit) ? "fail" : "") << " " <<
std::endl;
ss.get(*s2.rdbuf());
std::cout << "post-get : " <<
(((ss.rdstate() & std::ios::badbit) == std::ios::badbit) ? "bad" : "") << " " <<
(((ss.rdstate() & std::ios::eofbit) == std::ios::eofbit) ? "eof" : "") << " " <<
(((ss.rdstate() & std::ios::failbit) == std::ios::failbit) ? "fail" : "") << " " <<
std::endl;
unsigned int linelen = ss.gcount() - 1;
if (ss.eof())
{
ss.str(s2.str());
break;
}
else if (ss.fail())
{
ss.str("");
break;
}
else
{
std::cout << s2.str() << std::endl;
}
}
}
}
Primero lee grandes cantidades de datos en un búfer de datos. Sé que hay mejores formas C++ de hacer esta parte, pero en mi aplicación real me entregan un búfer char [] y una longitud.
Escribo el búfer en un objeto std :: stringstream para poder eliminar una línea a la vez.
Pensé que usaría el método get (streambuf &) en el flujo de cadenas para escribir una línea en otra secuencia de cadenas donde luego puedo generarla.
Ignorando el hecho de que esta puede no ser la mejor forma de extraer una línea a la vez del buffer que leí (aunque me gustaría que alguien ofrezca una mejor alternativa a la que publico aquí) , tan pronto como se llame al primer , el ss
está en un estado de falla y no sé por qué. Hay una gran cantidad de datos en el archivo de entrada para que ss
contenga definitivamente más de una línea de entrada.
¿Alguna idea?