Ok, hier ist ein Code, der skizziert, was ich versuche zu tun.Einen STD-Stream effizient in einen anderen kopieren
#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;
}
}
}
}
Zuerst liest es große Datenblöcke in einen Datenpuffer. Ich weiß, es gibt bessere C++ - Möglichkeiten, diesen Teil zu machen, aber in meiner realen Anwendung bekomme ich einen char [] -Puffer und eine Länge.
Ich schreibe dann den Puffer in ein Objekt std :: stringstream, damit ich eine Zeile nach der anderen entfernen kann.
Ich dachte, ich würde die get (streambuf &) Methode auf dem stringstream verwenden, um eine Zeile in einen anderen stringstream zu schreiben, wo ich es dann ausgeben kann.
Die Tatsache ignorierend, dass dies möglicherweise nicht der beste Weg ist, um eine Zeile nach der anderen aus dem Puffer zu extrahieren, den ich gelesen habe (obwohl ich möchte, dass jemand eine bessere Alternative zu der hier geposteten anbietet) Sobald der erste aufgerufen wird, ist der ss
in einem Fehlerzustand und ich kann nicht herausfinden warum. Es gibt viele Daten in der Eingabedatei, so dass ss
definitiv mehr als eine Zeile der Eingabe enthalten sollte.
Irgendwelche Ideen?