2010-10-31 2 views
13

Ich muss mehrere Bytes von einem istream zu einem ostream kopieren, es gibt 2 Wege, die ich kenne, um diese Kopie durchzuführen.Fast kontrollierte Kopie von istream zu ostream

myostream << myistream.rdbuf(); 

und

copy(istreambuf_iterator<char>(myistream), 
     istreambuf_iterator<char>(), 
     ostreambuf_iterator<char>(myostream) 
); 

ich gefunden habe, dass rdbuf Version ist mindestens doppelt so schnell wie die copy.
Ich habe noch nicht die Art des Kopierens gefunden, sagen wir 100 Bytes, aber da die zu kopierende Größe wahrscheinlich ziemlich groß ist, würde ich gerne in der Lage sein, die rdbuf Version zu verwenden, wenn möglich.

Kann jemand diese Kopien auf eine bestimmte Anzahl von Bytes begrenzen?

Antwort

9

Können Sie 0x verwenden? Wenn ja, dann können Sie verwenden copy_n:

copy_n(istreambuf_iterator<char>(myistream), 
     100, 
     ostreambuf_iterator<char>(myostream) 
); 

EDIT 1:

Ich weiß, dass Sie wahrscheinlich für eine Bibliothek Lösung suchen, und Sie wahrscheinlich diese auf eigene Faust herausgefunden haben könnte. Aber falls Sie an so etwas nicht gedacht haben, würde ich Folgendes tun (wenn ich nicht copy_n hätte):

void stream_copy_n(std::istream & in, std::size_t count, std::ostream & out) 
{ 
    const std::size_t buffer_size = 4096; 
    char buffer[buffer_size]; 
    while(count > buffer_size) 
    { 
     in.read(buffer, buffer_size); 
     out.write(buffer, buffer_size); 
     count -= buffer_size; 
    } 

    in.read(buffer, count); 
    out.write(buffer, count); 
} 
+0

Ich wünschte, ich könnte, im Moment nicht! –