2012-05-20 7 views
10

Quando uno stream stdio incontra un errore (ma non EOF), l'indicatore di errore del flusso verrà impostato in modo che ferror() restituisca valori diversi da zero. Ho sempre dato per scontato che ulteriori informazioni siano disponibili in errno. Ma come faccio a saperlo?Lo stdio imposta sempre errno?

Documentazione per alcune funzioni [ad es. man fopen sotto Linux] dice che verrà impostato anche errno. Tuttavia man fgets non menziona errno affatto. Le pagine informative glibc sono rassicuranti:

Oltre a impostare l'indicatore di errore associato al flusso , le funzioni che operano sui flussi fissati anche `errno' nello stesso modo le corrispondenti funzioni di basso livello che operare sui file descrittori.

Ma non ho idea di quanto sia forte questa garanzia. È richiesto dallo standard C? Cosa succede in Visual C/C++?

risposta

5

Lo standard C non richiede molto uso di errno WRT alle funzioni stdio; specifica ferror() ma dice di solo che

7.13.10.3 La La funzione ferror funzione ferror verifica l'indicatore di errore per lo stream puntato da stream. La funzione ferror restituisce un valore diverso da zero se e solo se l'indicatore di errore è impostato per lo streaming.

dal Draft C99: http://www.vmunix.com/~gabor/c/draft.html. Tutti i codici di errore effettivi utilizzati sono, per la maggior parte, definiti dall'implementazione.

Tuttavia, la libreria GNU C su Linux è inoltre conforme alle specifiche POSIX:

http://pubs.opengroup.org/onlinepubs/9699919799/toc.htm

che sono molto più ben definito in questo contesto. Ad esempio, se si guarda la pagina dedicata agli fopen:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/fopen.html

vedrete un sacco di informazioni dettagliate, compresi i codici specifici errno, sotto errori.

Ancora una volta, la libreria GNU C utilizzata su tutti i normali sistemi Linux è conforme a POSIX, quindi è possibile contare su tali informazioni;). Quelle pagine man POSIX (online) sono anche generalmente più dettagliate delle pagine man del sistema linux standard (leggi entrambi).

WRT per archiviare operazioni su altre piattaforme (non POSIX), avranno le proprie implementazioni. Sfortunatamente, roba del genere non è trasportabile in modo trasparente negli standard C. Gli stream C++ hanno però una gestione degli errori più standardizzata.

+1

Grazie. Le definizioni POSIX sono molto utili. Ad esempio, in base a loro, "fgets" ha effettivamente impostato errno.Penso che la migliore strategia per il mio caso specifico sia scrivere solo per POSIX e quindi correggere i problemi di Windows non appena si presentano. –

3

Secondo lo standard C11, capitolo 7.21 ("stdio.h"), solo fgetpos, fsetpos e ftell scrittura a errno in caso di errore.

Problemi correlati