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