octet par octet d'impression

voix
-3

Je suis en train de faire un programme C qui ouvre un fichier et imprime son octet par octet en utilisant le format Hexabyte (% de 02x) pour chaque octet.

Le résultat devrait être quelque chose comme ceci:

$ ./hexabyte file
43
3d
67
...

Je sais que je veux utiliser fread pour ce faire, mais je ne sais pas pourquoi cette solution ne fonctionne pas:

#include<stdlib.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>


int args_test(int args, char path[]){

  if(args < 1){
    fprintf(stderr, Usage: %s path\n, path);
    exit(EXIT_SUCCESS);
  }
  if(args < 2){
    fprintf(stderr, Usage: %s path\n, path);
    exit(EXIT_SUCCESS);
  }

  if(args > 2){
    fprintf(stderr, Usage: %s path\n, path);
    exit(EXIT_SUCCESS);
  }

  return 0;
}


int open_file(char path[]){
  FILE *fp;
  fp = fopen(path, r);
  char buffer[1000];

  if(!fp){
    fprintf(stderr, %s\n, strerror(errno));
    return EXIT_FAILURE;
  }

  fseek(fp, 0, SEEK_END);
  int len = ftell(fp);

  //Why does it not reach this loop?
  while (fread(buffer, strlen(path), 1, fp) == 1){
    printf(%02x hexabytes\n, len);
  }

  fclose(fp);

  exit(EXIT_SUCCESS);
}

int main(int args, char* argv[]){
  if(args < 2 || args > 2){
    args_test(args, argv[0]);
  }
  args_test(args, argv[1]);
  open_file(argv[1]);
  exit(EXIT_SUCCESS);
}

Il semble que cela n'a jamais atteint ma boucle while, et celui-ci n'imprime rien

Créé 19/09/2018 à 13:24
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
1

Même si vous résoudre le fseekproblème, vous avez d' autres questions:

while (fread(buffer, strlen(path), 1, fp) == 1){
  printf("%02x hexabytes\n", len);
}

Notez que vous ne lisez pas un seul octet à la fois; vous lisez octets en strlen(path)morceaux -sized à la fois.

Vous êtes également pas l' impression que vous venez de lire l'octet (s); vous imprimez la longueur du fichier . Donc , en supposant que votre taille de fichier est, par exemple, 65536 octets, vous aurez la sortie

10000 hexabytes
10000 hexabytes
10000 hexabytes
...

65536 / strlen(path)fois. Je ne pense pas que ce soit ce que vous voulez.

Je pense que ce que vous allez pour quelque chose de plus dans ce sens:

unsigned char buffer[1000]; // for arbitrary bytes, unsigned char works better.

int bytes_read = 0;

while ( (bytes_read = fread( buffer, 1, sizeof buffer, fp )) != EOF )
{
  for( int b = 0; b < bytes_read; b++ )
  {
    printf( "%02hhx\n", buffer[b] ); // %x expects unsigned *int*, use the
  }                                  // hh modifier to specify unsigned char
}

L'expression

bytes_read = fread( buffer, 1, sizeof buffer, fp )

lit jusqu'à sizeof buffer(1000 dans ce cas) octets fpet stocke le nombre réellement lu à bytes_read. Si nous n'avons pas touché EOF, alors nous imprimer le contenu buffer.

Créé 19/09/2018 à 14:31
source utilisateur

voix
1

Vous cherchez à la fin du fichier, donc freadn'aurez rien à lire. Vous devez demander revenir au début.

Le freadest demandé aussi de lire la longueur du chemin, ce qui semble mal, la façon dont votre boucle est mis en place semble être pour 1 octet à la fois.

fseek(fp, 0, SEEK_END); // Seeks to end of file
int len = ftell(fp);

// Nothing to read, at end
while (fread(buffer, strlen(path), 1, fp) == 1){
    printf("%02x hexabytes\n", len);
}

Il suffit de chercher à nouveau après la ftell.

fseek(fp, 0, SEEK_END); // Seeks to end of file
int len = ftell(fp);
fseek(fp, 0, SEEK_SET); // Go to start again
// Read from start, 1 byte at a time
char byte;
while (fread(&byte, 1, 1, fp) == 1){
    printf("%02X\n", (int)byte);
}

Vous pouvez également lire 1000 octets à la fois (comme bufferest) , mais vous avez besoin d' une deuxième boucle, ou vous pouvez lire le fichier entier, mais vous devez allouer dynamiquement la mémoire tampon ( buffer = malloc(len);).

Créé 19/09/2018 à 13:32
source utilisateur

voix
1

Vous devez réinitialiser le pointeur de fichier au début du fichier:

fseek(fp, 0, SEEK_SET);
Créé 19/09/2018 à 13:28
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more