2011-08-08 3 views
4

Je suis un peu un débutant à C++ (en passant de C#) donc je ne suis pas exactement sûr de ce qui se passe ici. Ce que j'essaye de faire est de lire une image d'un fichier et de l'écrire dans un fichier de sortie, mais chaque fois que je fais des parties du fichier semblent être corrompues. J'ai vérifié les données dans la mémoire et il correspond réellement, donc je crois que le coupable doit être quelque chose qui se passe avec fwrite(), bien qu'il puisse toujours être juste quelque chose que je fais mal.fwrite() Corruption de fichier C++

Voici quelques exemples de données: http://pastebin.com/x0eZin6K

Et mon code:

// used to figure out if reading in one giant swoop has to do with corruption 
    int BlockSize = 0x200; 
    // Read the file data 
    unsigned char* data = new unsigned char[BlockSize]; 
    // Create a new file 
    FILE* output = fopen(CStringA(outputFileName), "w+"); 
    for (int i = 0; i < *fileSize; i += BlockSize) 
    { 
     if (*fileSize - i > BlockSize) 
     { 
      ZeroMemory(data, BlockSize); 
      fread(data, sizeof(unsigned char), BlockSize, file); 
      // Write out the data 
      fwrite(data, sizeof(unsigned char), BlockSize, output); 
     } 
     else 
     { 
      int tempSize = *fileSize - i; 
      ZeroMemory(data, tempSize); 
      fread(data, sizeof(unsigned char), tempSize, file); 
      // Write out the data 
      fwrite(data, sizeof(unsigned char), tempSize, output); 
     } 
    } 
    // Close the files, we're done with them 
    fclose(file); 
    fclose(output); 
    delete[] data; 
    delete fileSize; 

Merci d'avance!

Répondre

9

Exécutez-vous ce code sous Windows? Pour les fichiers qui ne nécessitent pas de traduction de texte, vous devez les ouvrir en mode binaire:

FILE* output = fopen(CStringA(outputFileName), "wb+"); 

C'est ce qui se passe dans votre fichier de sortie:

07 07 07 09 09 08 0A 0C 14 0D 0C 

07 07 07 09 09 08 0D 0A 0C 14 0D 0C 
        ^^ 

La bibliothèque d'exécution C traduit obligeamment votre \n à \r\n.

+0

Ah! J'ai ouvert le fichier initial en mode binaire mais pas le fichier de sortie. Tu es génial, merci! – Lander