2013-03-29 12 views
5

Quindi non sono completamente sicuro di come usare fread. Ho un file binario in little-endian che ho bisogno di convertire in big-endian, e non so come leggere il file. Ecco quello che ho finora:Come fa a sapere quando il file è finito in C?

FILE *in_file=fopen(filename, "rb"); 
char buffer[4]; 
while(in_file!=EOF){ 
    fread(buffer, 4, 1, in_file); 
    //convert to big-endian. 
    //write to output file. 
} 

non ho ancora scritto nulla altra cosa, ma io non sono solo sicuro di come ottenere fread di 'progresso', per così dire. Qualsiasi aiuto sarebbe apprezzato.

+0

Completa il programma ed eseguilo! 'fread' leggerà da dove è stato interrotto l'ultima volta il ciclo. Dovresti controllare il valore di ritorno da 'fread'. non è probabile che 'infile' sia paragonabile a' EOF'. –

+4

Il primo passo per progredire è ** leggere la documentazione **. –

+1

Per uno, "rb" significa ** R ** ead ** B ** inary, quindi l'array dovrebbe essere di tipo int, non char. – MarcusJ

risposta

13

non è così che si correttamente leggere da un file in C.

fread restituisce un size_t che rappresenta il numero di elementi letti correttamente.

FILE* file = fopen(filename, "rb"); 
char buffer[4]; 

if (file) { 
    /* File was opened successfully. */ 

    /* Attempt to read */ 
    while (fread(buffer, 1, 4, file) == 4) { 
     /* byte swap here */ 
    } 

    fclose(file); 
} 

Come si può vedere, il codice di cui sopra sarebbe smettere di leggere non appena fread estrae qualcosa di diverso da 4 elementi.

+2

Suggerisco 'while (fread (buffer, 1, 4, file) == 4) {...}' per garantire che vengano letti 4 byte ed evitare il comportamento indefinito dell'utilizzo di valori non inizializzati. – Sebivor

+0

Grazie per averlo presentato. Ho appena realizzato che dovrei usare 1 per le dimensioni e 4 per il conteggio. Inoltre, nome fantastico bro! –

+0

Infatti. Non l'avevo notato, comunque. Il mio commento riguardava il confronto esplicito del valore di ritorno a 4, piuttosto che a 0, perché se fread restituisse 3, 2 o 1, allora nel buffer ci sarebbero byte non inizializzati, il che comporterebbe un comportamento indefinito se tali valori venissero usati. – Sebivor

Problemi correlati