Ok, Hier ist einige Code, der skizziert, was ich versuche zu tun.
#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;
}
}
}
}
Zunächst werden große Datenpakete in einen Datenpuffer eingelesen. Ich weiß, es gibt bessere C++ Möglichkeiten, diesen Teil zu tun, aber in meiner realen Anwendung wird mir ein char[] Puffer und eine Länge übergeben.
Dann schreibe ich den Puffer in ein std::stringstream-Objekt, aus dem ich jeweils eine Zeile entfernen kann.
Ich dachte, ich würde die Methode get( streambuf & ) auf dem Stringstream verwenden, um eine Zeile in einen anderen Stringstream zu schreiben, wo ich sie dann ausgeben kann.
Ungeachtet der Tatsache, dass dies vielleicht nicht der beste Weg ist, um eine Zeile nach der anderen aus dem Puffer zu extrahieren, den ich eingelesen habe (obwohl ich mich freuen würde, wenn jemand eine bessere Alternative als die hier gepostete vorschlagen könnte), sobald die erste ss.get( *s2.rdbuf() )
wird als die ss
ist im Fehlerzustand und ich kann nicht herausfinden, warum. In der Eingabedatei sind viele Daten enthalten. ss
sollte auf jeden Fall mehr als eine Eingabezeile enthalten.
Irgendwelche Ideen?