1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| const char FLAG = 0x47;
typedef std::vector<char> paquet_t;
std::vector<paquet_t> paquets;
std::ifstream f("nom fichier", std::ios_base::in|std::ios_base::binary);
if (!f) throw std::runtime_error("cannot open ``nom fichier''");
const size_t BUFFER_SIZE = 1024; // ou autre valeur intelligente
std::vector<char> buffer(BUFFER_SIZE);
// On peut même faire un buffer.reserve(NB) si on connait le nombre
// de paquets dans le fichier
packets.resize(1);
packet_t * current_packet = &packets.back();
while (size_t nb_read = f.read(&buffer[0], buffer.size()) ) {
if (nb_read != buffer.size())
buffer.resize(nb_read); // c'est la fin du fichier, on maj buffer.end()
packet_t::const_iterator f = v.begin();
packet_t::const_iterator p = std::find(f, buffer.end(), FLAG) ;
for ( ; p != buffer.end() ; p = std::find(f, buffer.end(), FLAG) )
{
++p; // On absorbe le FLAG
// On copie ce que l'on vent de lire à la fin du paquet courant
std::copy(f, p, std::back_inserter(*current_packet) );
// paquet suivant
packets.resize(packets.size() + 1);
current_packet= &packets.back();
// Repositionnement du marqueur de début
f = p;
}
// On commence à mettre ce qui reste du buffer dans le dernier paquet
// Mais on ne passe pas au paquet suivant car la suite va de nouveau arriver dans le buffer
std::copy(f, buffer.end(), std::back_inserter(*current_packet));
} // fin de la lecture
// au cas où le dernier paquet ne contiendrait rien.
if (!packets.empty() && (packets.back().size() == 0)) {
packets.resize(packets.size() - 1);
} |
Partager