2010-04-07 2 views
0
#define fileSize 100000 
int main(int argc, char *argv[]){  
     char *name=argv[1]; 
     char ret[fileSize]; 
     FILE *fl = fopen(name, "rb"); 
     fseek(fl, 0, SEEK_END); 
     long len = fileSize; 
     fseek(fl, 0, SEEK_SET); 
     //fread(ret, 1, len, fl); 
     int i; 
     *(ret+fileSize) = '\0'; 
     for (i=0; i<fileSize; i++){ 
      *(ret+i)=fgetc(fl); 
      printf("byte : %s \n", ret); 
     } 
     fclose(fl); 
} 

Dans le code ci-dessus, lorsque je donne le nom d'un fichier jpeg, il lit quelque chose après le 4ème caractère comme '' ... des idées? Merci!Pourquoi ce code lit-il tout '' pour le tout après le 4ème caractère?

+0

'* (ret + fileSize) = « \ 0'' est piétinement sur la mémoire. Et vous voulez probablement 'long len = ftell (fl)'. Et pour allouer dynamiquement la mémoire que vous allez lire. – MSN

Répondre

4

Cela est dû au fait que% s essaie d'imprimer une chaîne. Il détecte la fin de la chaîne en recherchant le caractère nul (valeur de byte de 0). Donc, il n'est probablement pas du tout en train d'imprimer un espace, mais plutôt une chaîne vide, car il rencontre un octet avec une valeur de 0.

1

Je serais plutôt d'accord pour dire que vous lisez un octet nul et suggère que vous utilisez% d comme votre personnage de format, bien que je préfère personnellement hex et utilisez

printf("byte : 0x%02X \n", ret); 

Mais, j'ai une question pour vous. Dans un programme si petit, pourquoi nous demander? Je ne suis pas sarcastique, je me demande honnêtement pourquoi vous ne le déboguez pas vous-même. Il suffit de le construire dans Eclipse et de passer à travers, une ligne à la fois, et Eclipse vous montrera les valeurs de toutes les variables locales et il devrait sauter sur vous ce qui ne va pas. Encore une fois - aucune infraction prévue.

BTW, vous pouvez trouver le format de fichier JPEG réel here.

Questions connexes