2010-10-31 11 views
13

Je dois copier plusieurs octets à partir d'un istream vers un ostream, il y a 2 façons que je connais pour effectuer cette copie.Copie rapide contrôlée d'istream vers ostream

myostream << myistream.rdbuf(); 

et

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

J'ai trouvé que la version rdbuf est au moins deux fois plus vite que le copy.
Je n'ai pas encore trouvé le moyen de copier juste, disons 100 octets, mais comme la taille à copier sera probablement assez grande, j'aimerais pouvoir utiliser la version rdbuf si posible.

Est-ce que quelqu'un sait comment limiter ces copies à un nombre donné d'octets?

Répondre

9

Pouvez-vous utiliser 0x? Si oui, alors vous pouvez utiliser copy_n:

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

EDIT 1:

Je sais que vous êtes probablement pour une solution de la bibliothèque, et vous pourriez probablement avoir compris cela vous-même. Mais au cas où vous ne l'avez pas pensé à quelque chose comme ça, voici ce que je ferais (si je n'ai pas copy_n):

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

Je voudrais pouvoir, pas pour l'instant si! –