Rappresentare EOF nel codice C?

Il carattere di nuova riga è rappresentato da "\n" nel codice C. Esiste un equivalente per il carattere di fine file (EOF)?

EOF non è un personaggio (nella maggior parte dei moderni sistemi operativi). È semplicemente una condizione che si applica a un stream di file quando viene raggiunta la fine del stream. La confusione deriva dal fatto che un utente può segnalare EOF per l’input della console digitando un carattere speciale (ad esempio Control-D in Unix, Linux, et al ), ma questo personaggio non è visto dal programma in esecuzione, viene catturato dal sistema operativo che a sua volta segnala EOF al processo.

Nota: in alcuni sistemi operativi molto vecchi EOF era un personaggio, ad esempio Control-Z in CP / M, ma si trattava di un rozzo trucco per evitare il sovraccarico del mantenimento delle lunghezze dei file nelle directory del file system.

No. EOF non è un personaggio, ma uno stato del filehandle.

Mentre ci sono dei caratteri di controllo nel set di caratteri ASCII che rappresenta la fine dei dati, questi non sono usati per segnalare la fine dei file in generale. Ad esempio EOT (^ D) che in alcuni casi indica quasi lo stesso.

Quando la libreria C standard utilizza il numero intero con segno per restituire caratteri e usa -1 per la fine del file, questo è in realtà solo il segnale da indicare rispetto a un errore. Non ho lo standard C disponibile, ma per citare SUSv3:

Se l’indicatore di fine file per il stream è impostato, o se il stream è alla fine del file, l’indicatore di fine file per il stream deve essere impostato e fgetc () deve restituire EOF. Se si verifica un errore di lettura, l’indicatore di errore per il stream deve essere impostato, fgetc () deve restituire EOF e deve impostare errno per indicare l’errore.

EOF non è un personaggio. Non può essere: Un file (binario) può contenere qualsiasi carattere. Supponiamo di avere un file con byte sempre crescenti, che va da 0 1 2 3 a 255 e ancora 0 1 … 255, per un totale di 512 byte. Qualunque di quei 256 possibili byte che si ritengono EOF , il file verrà interrotto.

Ecco perché getchar() et al. restituire un int . L’intervallo di valori restituiti possibili è quelli che può avere un char , oltre a un valore int originale EOF (definito in stdio.h ). Questo è anche il motivo per cui la conversione del valore di ritorno in un char prima di verificare se EOF non funziona.

Nota che alcuni protocolli hanno caratteri “EOF”. ” ASCII ha “End of Text”, “End of Transmission”, “End of Transmission Block” e “End of Medium”. Altre risposte hanno menzionato i vecchi OS. Io stesso inserisco ^ D su Linux e ^ Z su console Windows per smettere di dare input ai programmi. (Ma i file letti tramite pipe possono avere ovunque caratteri ^ D e ^ Z e solo segnalare EOF quando esauriscono i byte.) Le stringhe C vengono terminate con il carattere '\0' , ma ciò significa anche che non possono contenere il carattere '\0' . Ecco perché tutte le funzioni di dati non stringa C funzionano utilizzando un array di char (per contenere i dati) e un size_t (per sapere dove finisce il dato).

Modifica: lo standard C99 §7.19.1.3 afferma:

Le macro sono […]
EOF
che si espande a un’espressione costante intera, con tipo int e un valore negativo, che viene restituito da diverse funzioni per indicare la fine del file , cioè non più input da un stream;

Ho letto tutti i commenti. È interessante notare cosa succede quando si stampa questo:

 printf("\nInteger = %d\n", EOF); //OUTPUT = -1 printf("Decimal = %d\n", EOF); //OUTPUT = -1 printf("Octal = %o\n", EOF); //OUTPUT = 37777777777 printf("Hexadecimal = %x\n", EOF); //OUTPUT = ffffffff printf("Double and float = %f\n", EOF); //OUTPUT = 0.000000 printf("Long double = %Lf\n", EOF); //OUTPUT = 0.000000 printf("Character = %c\n", EOF); //OUTPUT = nothing 

Come possiamo vedere qui, EOF NON è un personaggio (qualunque sia).

Il carattere EOF riconosciuto dall’interprete dei comandi su Windows (e MSDOS e CP / M) è 0x1a (decimale 26, ovvero Ctrl + Z, ovvero SUB)

Può ancora essere usato oggi per esempio per marcare la fine di un’intestazione leggibile da umani in un file binario: se il file inizia con “Some description \ x1a” l’utente può scaricare il contenuto del file nella console usando il comando TYPE e il dump si fermerà al carattere EOF, cioè stampa alcune descrizioni e si ferma, invece di continuare con la spazzatura che segue.

Il valore di EOF non può essere confuso con nessun personaggio reale.

Se a= getchar() , allora dobbiamo dichiarare a abbastanza grande da contenere qualsiasi valore getchar() da getchar() . Non possiamo usare char perché deve essere abbastanza grande da contenere EOF oltre ai caratteri.

La risposta è NO, ma …

Potresti essere confuso a causa del comportamento di fgets()

Da http://www.cplusplus.com/reference/cstdio/fgets/ :

Legge i caratteri dallo stream e li memorizza come stringa C in str finché non vengono letti (num-1) caratteri o una nuova riga o viene raggiunta la fine del file , a seconda dell’evento che si verifica per primo.

Questo dipende dal sistema ma spesso -1. Vedi qui

Esiste l’ EOF costante di tipo int, trovato in stdio.h. Non esiste un letterale di caratteri equivalenti specificato da alcuno standard.

Penso che possa variare da sistema a sistema, ma un modo di controllare sarebbe semplicemente usare printf

 #include  int main(void) { printf("%d", EOF); return 0; } 

L’ho fatto su Windows e -1 stato stampato sulla console. Spero che questo ti aiuti.