Innanzitutto in modalità r+ non mi si apre alcun file binario. Ho sostituito con r (o rb) e funziona.
Poi, questo fatto
In pratica, il ciclo di stampa Buf[i] sembra cominci a stampare non dall'inizio del buffer ma più avanti...si perde i primi byte. Se invece mietto Buf[0] o Buf[1] li stampa.
mi sembra piuttosto strano: a me non succede... ovviamente - spero non sia questo il problema - se il file è molto lungo la shell non ti mostrerà mai tutti i byte dato che ha un buffer limitato... probabilmente ti mostrerà solo gli ultimi 100-200-300 (ma questo non perché il tuo programma non legge gli altri dal file). Per provare a vedere se ti stampa i primi byte, puoi provare a ciclare l'ultimo for da 0 a (ad esempio) 100, così sei sicuro che potrai leggere tutti i byte dalla shell (oppure li puoi stampare lo stesso tutti, ma su un file e non a video).
Per quanto riguarda il problema degli FFFFFF davanti a tutti i byte stampati (a dire il vero a me capita solo per alcuni e non per tutti) ho risolto il problema così:
codice:
char *Buf; -> unsigned char *Buf;
e ovviamente
codice:
Buf=(char *)malloc(fileLen+1); -> Buf=(unsigned char *)malloc(fileLen+1);
leggendo i byte come "unsigned char" piuttosto che come "char (signed)" sei sicuro che ognuno di essi ti verrà letto su 8 bit (secondo la codifica ASCII estesa, e non su 7 come prevede la codifica ASCII). Prova ad apportare questa modifica e facci sapere...
Per intenderci, a me questo programma funziona benissimo
codice:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *pf;
unsigned char *Buf;
int i;
unsigned long fileLen;
if (argc != 2) {
printf("Sintassi: nome_programma nome_file\n");
exit(1);
}
if ((pf = fopen(argv[1], "rb")) == NULL) {
printf("Impossibile aprire il file %s\n", argv[1]);
exit(1);
}
//Ricava lunghezza file
fseek(pf, 0, SEEK_END);
fileLen = ftell(pf);
fseek(pf, 0, SEEK_SET);
//Alloca memoria buffer
Buf = (unsigned char *) malloc(fileLen + 1);
if (!Buf) {
fprintf(stderr, "Memory error!");
fclose(pf);
exit(1);
}
//Lettura contenuto file nel buffer
while (!feof(pf)) {
fread(Buf, fileLen, 1, pf);
}
fclose(pf);
/* qui eventualmente sostituisci "fileLen" con 100 o 200 per vedere
se ti stampa i primi byte */
for (i = 0; i <= fileLen; i++)
printf("%.2x\n", (int) Buf[i]);
free(Buf);
return 0;
}