PDA

Visualizza la versione completa : [C] visualizzare file binario


sizeof
14-10-2013, 18:23
Ciao a tutti,
qualcuna sa dirmi se c'è un modo per visualizzare un file binario come un file sequenziale ?
cioè, faccio un esempio:
se scrivo un file sequenziale quello che scrivo da tastiera posso visualizzarlo esattamente aprendo il file mentre per un file binario non è la stessa cosa. vorrei sapere se c'è un modo per farlo
Grazie

oregon
14-10-2013, 20:01
Hai parecchia confusione ...

"Sequenziale" è una modalità di accesso (per cui anche per un file binario puoi accedere ai dati in modo sequenziale)

"Binario" non è un vero e proprio tipo di file perché è solo l'interpretazione che fai dei suoi dati

In poche parole, se apri un file binario, non vedrai i suoi dati come "caratteri ASCII" ma potrai vedere la sequenza di numeri equivalenti ai suoi byte. Ma anche un file di testo potresti vederlo come sequenza di byte.

sizeof
14-10-2013, 20:05
ok ma io vorrei vedere il file binario con i dati e non come sequenza di byte

oregon
14-10-2013, 21:16
Ma cosa intendi "vedere con i dati" ?? Fai un esempio ...

sizeof
15-10-2013, 15:42
tipo inserisco i dati dallo standard input in una struttura per esempio un classifica di calcio, poi scrivo questa struct in un file binario.
Visualizzo i dati (con un ciclo iterativo) prendendoli direttamente dalla struct. Io vorrei poter aprire il file binario e leggere gli stessi dati come se li leggessi dalla struct. Ora so che se scrivo la struct su un file sequenziale, posso aprire il file e leggere i dati. Vorrei sapere se posso fare la stessa cosa anche per un file binario..grazie

MItaly
15-10-2013, 15:46
Non è possibile farlo con un editor generico; un normale editor lavora su stringhe di caratteri ASCII, mentre un file scritto in quella maniera è semplicemente il dump della rappresentazione binaria in memoria della struct su file. Se l'editor non sa come è fatta la struct scritta su file, come può visualizzartela in maniera sensata?

Quello che normalmente si fa per ispezionare e debuggare file binari è aprirli con i cosiddetti editor esadecimali, che di base mostrano il contenuto del file come byte e il loro corrispondente esadecimale, oltre ad avere funzioni che consentono di interpretare rapidamente i byte specificati secondo vari schemi (short, int, float, double, stringa ASCII, stringa in un qualche formato Unicode, ...)

http://home.gna.org/bless/images/bless01.png

In genere gli editor più avanzati di questo tipo forniscono anche un qualche linguaggio di scripting per consentirgli di analizzare file binari in maniera comoda ma, di nuovo, i dati sulla struttura del file (=come interpretarlo) glieli devi fornire tu.

sizeof
15-10-2013, 16:47
Ok quindi l'unico modo per visualizzare i dati che ho scritto su un file binario è quello di aprire il file binario in lettura e "stamparlo" a video, giusto?

MItaly
15-10-2013, 16:53
Esatto.

oregon
15-10-2013, 17:04
Diciamo che non ci ho capito niente ma è un mio limite ...

sizeof
15-10-2013, 17:54
ho fatto questo programma




#include <stdio.h>
#define n 2

struct riga {
char nome[15];
int punti;
} ri[n];

int main()
{
int i, j;
int agg_punti;
char buffer[15];
int app;

printf("Inserisci la classifica\n\n");
for ( i = 0; i < n; i++ ) {
printf("Inserisci la squadra in posizione %d\n", n - i);
scanf("%s", ri[i].nome);
printf("Inserisci il punteggio della squadra in posizione %d\n", n - i);
scanf("%d", &ri[i].punti);
}


FILE *cfPtr;

if ((cfPtr = fopen("classifica.dat", "wb")) == NULL ) {
printf("Il file non pò essere aperto.\n");
} else {
for ( i = 0; i < n; i++ ) {
fwrite( &ri, sizeof(struct riga), 1, cfPtr);
}
fclose(cfPtr);
}

if((cfPtr = fopen("classifica.dat", "rb")) == NULL ) {
printf("Il file non può essere aperto.\n");
} else {
printf("%28s", "CLASSIFICA\n");
printf("%15s%20s", "SQUADRA", "PUNTI\n");
while ( !feof(cfPtr) ) {
fread( &ri, sizeof( struct riga), 1, cfPtr);
}
for ( i = 0; i < n; i++ ) {
printf("%15s%19d", ri[i].nome, ri[i].punti);
printf("\n");
}
fclose(cfPtr);
}
printf("\n\n");
for ( i = 0; i < n; i++ ) {
printf("Inserisci i punti conseguiti dalla squadra %s : \n", ri[i].nome);
scanf("%d", &agg_punti);
ri[i].punti += agg_punti;
}

for ( i = 0; i < n - 1; i++ ) {
for ( j = i + 1; j < n; j++ ) {
if ( ri[i].punti < ri[j].punti ) {
strcpy( buffer, ri[i].nome);
strcpy(ri[i].nome, ri[j].nome);
strcpy(ri[j].nome, buffer);
app = ri[i].punti;
ri[i].punti = ri[j].punti;
ri[j].punti = app;
}
}
}

printf("%33s", "CLASSIFICA AGGIORNATA\n");
printf("%15s%20s", "SQUADRA", "PUNTI\n");
for ( i = 0; i < n; i++ ) {
printf("%15s%19d", ri[i].nome, ri[i].punti);
printf("\n");
}

if ((cfPtr = fopen("classifica.dat", "wb")) == NULL ) {
printf("Il file non può essere aperto.\n");
} else {
for (i = 0; i < n; i++) {
fwrite(&ri, sizeof( struct riga), 1, cfPtr);
}
fclose(cfPtr);
}
return 0;
}


Nella parte relativa alla lettura dal file, cioè


if((cfPtr = fopen("classifica.dat", "rb")) == NULL ) {
printf("Il file non può essere aperto.\n");
} else {
printf("%28s", "CLASSIFICA\n");
printf("%15s%20s", "SQUADRA", "PUNTI\n");
while ( !feof(cfPtr) ) {
fread( &ri, sizeof( struct riga), 1, cfPtr);
}
for ( i = 0; i < n; i++ ) {
printf("%15s%19d", ri[i].nome, ri[i].punti);
printf("\n");
}
fclose(cfPtr);
}


non sono sicuro se vado a "stampare" a video leggendo i dati prendendoli dal file per portarli nella struct e poi "stampandoli" oppure se vado a prenderli direttamente dalla struct e quindi "stampandoli" a video...che ne dite?

Loading