2017-09-24 6 views
0

Le problème est de récupérer certains fichiers JPG à partir d'un fichier .raw.Mes IMG récupérés ne correspondent pas à l'original dans la récupération CS50

lorsque je lance check50 je suis "récupéré img ne correspond pas".

:) existe.
:) recover.c compile.
:) poignées manque d'images médico-légale
:( récupère correctement de – image récupérée ne correspond pas à
:( récupère les images correctement – moyen image récupérée ne correspond pas à
:( récupère correctement de – de 015.jpg pas trouvé

J'ai vraiment essayé d'identifier le problème et chaque fois que je ne parviens pas à identifier où le problème est, j'espère que quelqu'un peut et gi ve moi une paix de conseil.

#include <stdio.h> 
#include <stdint.h> 

int main(int argc, char *argv[]){ 

if(argc != 2){ 

    fprintf(stderr, "Usage: ./recover image"); 
    return 1; 
} 

//open file 

FILE *inptr = fopen(argv[1], "r"); 
if (inptr == NULL){ 

    fprintf(stderr, "Could not open %s.\n", argv[1]); 
    return 2; 
} 


int foundjpg = 0; 
char filename[10]; 
int x=1; 

//repeat until end of the card 
while(x == 1){ 

    //buffer 
    unsigned char buf[512]; 
    x = fread(buf, 512, 1, inptr); 
    //read into buffer 
    fread(buf, 512, 1, inptr); 
    FILE *jpg = fopen(filename, "w"); 

    //start of a new jpg? 
    if(buf[0]== 0xff && buf[1] == 0xd8 && buf[2] == 0xff && (buf[3] & 0xf0) == 0xe0){ 


     if(jpg != NULL){// yes i found before 

      fclose(jpg); 
      sprintf(filename, "%03i.jpg" ,foundjpg); 
      foundjpg++; 
      jpg = fopen(filename, "w"); 


     } 
     else{ 
      sprintf(filename, "%03i.jpg" ,foundjpg); 
      jpg = fopen(filename , "w"); 
      foundjpg++; 

     } 
    } 
    //already found a jpg? 
    if(jpg != NULL && foundjpg > 0){ 

     fwrite(buf, 1, 512, jpg); 

    } 

} 


fclose(inptr); 

// success 
return 0; 

}

+1

Il existe un site désigné sur le réseau d'échange de pile pour [cs50.se]. – StoryTeller

Répondre

1

L'ordre dans lequel vous faites des choses est assez confus et conduit à des erreurs. Par exemple:

  • filename n'est pas initialisé lorsque vous l'utilisez pour la première fois.
  • Vous augmentez le compteur foundjpg après l'avoir utilisé pour créer le nom de fichier, ce qui dans votre programme signifie que la deuxième image est appelée 01.jpg. Tous les indices d'image sont désactivés par un et le dernier est manquant.
  • Lorsque les octets d'identification n'identifient pas un jpg valide, aucun nouvel enregistrement n'est lu et votre boucle ne se termine jamais.

Vous devriez réorganiser votre code de façon à ce qu'il le fasse de manière naturelle. Le programme pourrait ressembler à ceci:

  • arguments de ligne de commande Vérifier
  • Ouvrez le fichier brut
  • Boucle principale:
    • Lire le bloc de taille fixe. Si elle ne peut pas être lu, sortir de la boucle
    • Vérifiez si les premiers octets identifient un jpg et si oui:
      • Créer un nom de fichier
      • Ouvrir le fichier jpg pour écrire
      • bloc d'écriture et à proximité fichier jpg
      • bloc incrémente le compteur
  • Fermer fichier brut

Vous devez décider comment vous gérez les erreurs. Sautez-vous des blocs erronés ou abandonnez-vous le programme?

On ne sait pas non plus si toutes les images ont une longueur de 512 octets, ce qui semble improbable. Peut-être que vous devez lire la taille réelle de l'image de l'en-tête, puis copier l'image entière.