Utskrift byte av byte

stemmer
-3

Jeg prøver å lage et C-program som åpner en fil og skriver sin byte av byte med Hexabyte format (% 02X) for hver byte.

Resultatet bør være noe sånt som dette:

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

Jeg vet at jeg vil bruke fread å gjøre dette, men jeg er ikke sikker på hvorfor denne løsningen ikke fungerer:

#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);
}

Det virker som det aldri når min mens loop, og derfor skriver aldri noe

Publisert på 19/09/2018 klokken 13:24
kilden bruker
På andre språk...                            


3 svar

stemmer
1

Selv om du løser fseekproblemet, har du andre spørsmål:

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

Merk at du ikke leser en eneste byte om gangen; du leser bytes i strlen(path)-sized biter om gangen.

Du kan heller ikke skrive ut byte (e) du nettopp har lest; du skrive ut lengden på filen . Så forutsatt filstørrelsen er, si, 65536 bytes, vil du få output

10000 hexabytes
10000 hexabytes
10000 hexabytes
...

65536 / strlen(path)ganger. Jeg tror ikke det er det du ønsker.

Jeg tror det du er ute etter noe mer langs disse linjene:

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
}

Uttrykket

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

leser opp til sizeof buffer(1000 i dette tilfellet) bytes fra fpog lagrer nummeret faktisk lese til bytes_read. Hvis vi ikke har truffet EOF, da vi skrive ut innholdet i buffer.

Svarte 19/09/2018 kl. 14:31
kilden bruker

stemmer
1

Du søker til slutten av filen, så freadvil ikke ha noe å lese. Du må søke tilbake til start.

Det freadblir også bedt om å lese lengden på banen, noe som virker galt, måten sløyfe er satt opp ser ut til å være for en byte om gangen.

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);
}

Bare søke på nytt etter 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);
}

Du kan også lese 1000 byte om gangen (som bufferer), men da trenger du en annen sløyfe, eller du kan lese hele filen, men du trenger å tildele buffer dynamisk ( buffer = malloc(len);).

Svarte 19/09/2018 kl. 13:32
kilden bruker

stemmer
1

Du må tilbakestille filen pekeren til begynnelsen av filen:

fseek(fp, 0, SEEK_SET);
Svarte 19/09/2018 kl. 13:28
kilden bruker

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