Bonjour,
J'avais à implementer dans un test-unitaire un calcul de CRC, et je suis tombé sur un os qui me semble assez bizarre...

En gros, j'utilise un ifstream et son operateur >> pour lire les bytes d'un fichier, mais il sort ma boucle, 14 bytes avant la fin du fichier!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
      for (unsigned char c ; out >> c ; m_crc32.process_byte(c), uiByteRead++) ;

Toutes les idée seront les bienvenues! C'est pas un probleme bloquant, mais ça me semblait etre une manière compact et sommes toutes assez élégante de faire et que cela ne marche pas ..... ?



Dans le code ci-dessous, j'utilise boost pour recuperer la taille de mon fichier.
Ensuite, la premier section entre {} est mon premier jet utilisant un ifstream. Et enfin, la seconde section entre {} est le code "à la C" qui lui ce comporte assez bien !

voici la sortie du code... il y a une erreur de 1 sur le compteur en mode C, mais c'est pas le probleme. Le probleme c'est que je ne m'explique pas pourquoi avec ifstream, j'ai un flag eof qui est levé trop tot (a noter que j'ai aussi essayer de faire un while(!out.eof()) et que le résultat est le même le flag est levé alors qu'il manque 14 iteration!)

File size = 1504
by ifstream in-loop 1490
by fopen/fread in-loop 1505

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
size_t filesize = boost::filesystem::file_size(outputFile);
    std::cout << "File size = " << filesize << std::endl;
 
    {
      boost::crc_32_type  m_crc32;  
      unsigned int uiByteRead = 0;
      std::ifstream out(outputFile, std::ios::binary | std::ios::in);
      for (unsigned char c ; out >> c ; m_crc32.process_byte(c), uiByteRead++) ;
      std::cout << "by ifstream in-loop " << uiByteRead << std::endl;
    }
 
    {
      boost::crc_32_type  m_crc32;  
      unsigned int uiByteRead = 0;
      FILE* pf = fopen(outputFile, "rb");
      while(!feof(pf))
      {
        unsigned char c = 0;
        fread(&c, 1, 1, pf);
        m_crc32.process_byte(c);
        uiByteRead++;
      }
      fclose(pf);
      std::cout << "by fopen/fread in-loop " << uiByteRead << std::endl;
    }