2012-05-20 10 views
10

Cuando una secuencia stdio encuentra un error (pero no EOF), el indicador de error de la secuencia se establecerá de modo que ferror() devolverá distinto de cero. Siempre he supuesto que hay más información disponible en errno. ¿Pero cómo sé esto?¿Stdio siempre establece errno?

Documentación de algunas funciones [p. man fopen en Linux] dice que también se establecerá errno. Sin embargo, man fgets no menciona errno en absoluto. Las páginas de información sobre glibc son tranquilizadores:

Además de establecer el indicador de error asociado con la corriente , las funciones que operan sobre las corrientes también establecidas `errno' en el misma manera que las correspondientes funciones de bajo nivel que operar en el archivo descriptores.

Pero no tengo idea de lo fuerte que es esta garantía. ¿Es requerido por el estándar C? ¿Qué sucede en Visual C/C++?

Respuesta

5

El estándar C en sí mismo no requiere mucho uso de errno WRT para stdio funciones; especifica ferror() pero no dice de ellos que

7.13.10.3 El La función ferror función ferror inspecciona el indicador de error para el flujo indicado por flujo. La función ferror devuelve un valor distinto de cero si y solo si el indicador de error está configurado para la transmisión.

del C99 Draft: http://www.vmunix.com/~gabor/c/draft.html. Todos los códigos de error reales utilizados son, en su mayor parte, implementación definida.

Sin embargo, la biblioteca GNU C en Linux también se ajusta a las especificaciones POSIX:

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

que son mucho más bien definido en este contexto. Por ejemplo, si nos fijamos en la página para fopen:

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

verás una gran cantidad de información detallada, incluidos los códigos específicos errno, bajo errores.

Una vez más, la biblioteca GNU C utilizada en prácticamente todos los sistemas Linux normales cumple con POSIX, por lo que puede contar con esa información;). Esas páginas de manual de POSIX (en línea) generalmente también son más detalladas que las páginas man estándar del sistema de Linux (lea ambas).

WRT para archivar operaciones en otras plataformas (no POSIX), tendrán sus propias implementaciones. Desafortunadamente, cosas así no son transparentes en el estándar C. Las secuencias de C++ sí tienen un manejo de errores más estandarizado.

+1

Gracias. Las definiciones POSIX son muy útiles. Por ejemplo, según ellos, "fgets" sí establece errno.Creo que la mejor estrategia para mi caso particular es simplemente escribir para POSIX y luego corregir los problemas de Windows a medida que surgen. –

3

De acuerdo con el estándar C11, capítulo 7.21 ("stdio.h"), sólo se fgetpos, fsetpos y ftell escritura a errno en el caso de un error.

Cuestiones relacionadas