Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113

    [C] visualizzare file binario

    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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    ok ma io vorrei vedere il file binario con i dati e non come sequenza di byte

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma cosa intendi "vedere con i dati" ?? Fai un esempio ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    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

  6. #6
    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, ...)



    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.
    Ultima modifica di MItaly; 15-10-2013 a 15:51
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    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?

  8. #8
    Esatto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Diciamo che non ci ho capito niente ma è un mio limite ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    113
    ho fatto questo programma
    codice:
    
    #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è
    codice:
    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?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.