2013-05-21 18 views
15

Sono riuscito fino a questo punto con la consapevolezza che EOF è un carattere speciale inserito automaticamente alla fine di un file di testo per indicare la sua fine. Ma ora sento il bisogno di ulteriori chiarimenti su questo. Ho controllato su Google e la pagina di Wikipedia per EOF ma non è stato possibile rispondere a quanto segue e non ci sono nemmeno collegamenti esatti Stack Overflow per questo. Quindi, per favore mi aiuti su questo:Che cos'è veramente EOF per i file binari? Condizione? Carattere?

  • mio libro dice che i file modalità binaria tengono traccia della fine del file dal numero di caratteri presenti nella voce di directory del file. (A differenza dei file di testo che hanno un carattere EOF speciale per contrassegnare la fine). Quindi, qual è la storia di EOF nel contesto di file binari? Sono confuso perché nel seguente programma che uso con successo !=EOF confronto durante la lettura da un file .exe in modalità binaria:

    #include<stdio.h> 
    #include<stdlib.h> 
    
    int main() 
    { 
    
        int ch; 
        FILE *fp1,*fp2; 
    
        fp1=fopen("source.exe","rb"); 
        fp2=fopen("dest.exe","wb"); 
    
        if(fp1==NULL||fp2==NULL) 
        { 
        printf("Error opening files"); 
        exit(-1); 
        } 
    
        while((ch=getc(fp1))!=EOF) 
        putc(ch,fp2); 
    
        fclose(fp1); 
        fclose(fp2); 
    
        } 
    
  • È EOF un "personaggio" speciale a tutti? O è una condizione come dice Wikipedia, una condizione in cui il computer sa quando restituire un valore particolare come -1 (EOF sul mio computer)? Esempio di tale "condizione" si verifica quando una funzione di lettura dei caratteri termina la lettura di tutti i caratteri presenti o quando le funzioni I/O carattere/stringa incontrano un errore nella lettura/scrittura?

    È interessante notare che il tag Stack Overflow per EOF ha unito entrambe le definizioni dello EOF. Il tag per EOF ha dichiarato "Nella programmazione del dominio, EOF è una sequenza di byte (o un chacracter) che indica che non ci sono più contenuti dopo questo.", mentre nella sezione "about" è anche detto che "Fine del file (comunemente EOF abbreviato) è una condizione in un sistema operativo per computer in cui non è possibile leggere più dati da un'origine dati. file o stream. "

ma ho la forte sensazione EOF non sarà un personaggio come ogni altra funzione sembra essere restituirlo quando incontra un errore durante I/O.

Sarà davvero gentile da parte vostra se potete chiarire la questione per me.

+1

https://latedev.wordpress.com/2012/12/04/all-about-eof/ – Mat

+0

@Mat Grazie per questo link. Sembra abbastanza esaustivo.https: //ledev.wordpress.com/2012/12/04/all-about-EOF/ – Thokchom

risposta

21

I vari indicatori EOF forniti da C non hanno necessariamente nulla a che fare con il modo in cui il file system segna la fine di un file.

La maggior parte dei file system moderni conosce la lunghezza di un file perché la registra da qualche parte, separatamente dal contenuto del file. Le routine che leggono il file tengono traccia di dove stai leggendo e si fermano quando raggiungi la fine. Le routine di libreria C generano un valore EOF da restituire all'utente; non restituiscono un valore che si trova effettivamente nel file.

Si noti che l'EOF restituito dalle routine di libreria C non è in realtà un carattere. Le routine di libreria C in genere restituiscono un int e o un valore di carattere o un EOF. Ad esempio, in un'implementazione, i caratteri potrebbero avere valori compresi tra 0 e 255 e EOF potrebbe avere il valore -1. Quando la routine della libreria ha incontrato la fine del file, in realtà non ha visto un carattere -1, perché non esiste un tale carattere. Invece, è stato detto dalla routine di sistema sottostante che la fine del file era stata raggiunta e ha risposto restituendo -1 a te.

I vecchi e grezzi file system possono avere un valore nel file che segna la fine del file. Per varie ragioni, questo è solitamente indesiderabile. Nella sua implementazione più semplice, rende impossibile archiviare dati arbitrari nel file, perché non è possibile memorizzare l'indicatore di fine file come dati. Si potrebbe tuttavia avere un'implementazione in cui i dati grezzi nel file contengono qualcosa che indica la fine del file, ma i dati vengono trasformati durante la lettura o la scrittura in modo da poter archiviare dati arbitrari. (Ad es., "Quotando" il marcatore di fine del file.)

In alcuni casi, anche gli indicatori di fine del file vengono visualizzati negli stream. Questo è comune quando si legge dal terminale (o uno strumento pseudo-terminale o terminale).In Windows, premendo il controllo-Z è un'indicazione che l'utente è fatto entrare in ingresso, ed è trattato in modo simile per raggiungere un end-of-file. Questo non significa che control-Z sia un EOF. Il software di lettura dal terminale vede di controllo-Z, la considera come end-of-file, e restituisce end-of-file di indicazioni, che sono probabilmente diversi dal controllo-Z. Su Unix, control-D è comunemente una sentinella simile che segna la fine dell'input.

2

This should clear it up nicely for you.

Fondamentalmente, EOF è solo una macro con un valore predefinito che rappresenta il codice di errore da funzioni di I/O che indica che non vi sono più dati da leggere.

+0

Grazie Christopher.That link che hai dato è da uno dei miei preferiti sites.Good Ol ** Alex Allain ** !! avevo controllato la sezione C ** **, ma non ha mai saputo non c'è anche una bella parte delle FAQ. – Thokchom

0

EOF non è un personaggio. In questo contesto, è -1, che, tecnicamente, non è un personaggio (se si voleva essere estremamente precisi, si potrebbe sostenere che potrebbe essere un personaggio, ma questo è irrilevante in questa discussione). EOF, solo per essere chiari è "Fine del file". Mentre stai leggendo un file, devi sapere quando fermarti, altrimenti potrebbe accadere un numero di cose a seconda dell'ambiente se tenti di leggere oltre la alla fine del file.

Quindi, è stata ideata una macro per segnalare che Fine del file è stata raggiunta durante la lettura di un file, che è EOF.Per getc funziona perché restituisce uno int anziché uno char, quindi c'è spazio extra per restituire qualcosa di diverso da un char per segnalare EOF. Altre chiamate I/O possono segnalare in modo diverso EOF, ad esempio lanciando un'eccezione.

Come punto di interesse, in DOS (e forse ancora su Windows?) Un carattere effettivo, fisico ^Z è stato posto alla fine di un file per segnalare la sua fine. Quindi, su DOS, c'era effettivamente un carattere EOF. Unix non ha mai avuto una cosa del genere.

1

Il file non contiene effettivamente un EOF. EOF non è un tipo di carattere - ricorda che un byte può essere compreso tra 0 e 255, quindi non avrebbe senso se un file potesse contenere un -1. L'EOF è un segnale dal sistema operativo che stai utilizzando, che indica che è stata raggiunta la fine del file. Si noti come getc() restituisce un valore int, ovvero è in grado di restituirlo -1 per indicare che lo stream ha raggiunto la fine del file.

Il segnale EOF viene trattato allo stesso modo per file binari e di testo - la reale definizione di flusso binario e di testo varia tra i sistemi operativi (ad esempio su * nix binario e modalità testo sono la stessa cosa.) In entrambi i casi, come indicato sopra, non fa parte del file stesso. Il sistema operativo passa a getc() per dire al programma che è stata raggiunta la fine del flusso.

Da From the GNU C library:

Questa macro è un valore intero restituito da un certo numero di funzioni di flusso ristretti per indicare una condizione di fine del file, o qualche altra situazione di errore. Con la libreria GNU C, EOF è -1. In altre librerie, il suo valore potrebbe essere un altro numero negativo.