GOOGLE ADS

viernes, 15 de abril de 2022

¿Funciones de E/S estándar como envoltorios alrededor de las funciones de E/S de archivos?

He leído en alguna parte que funciones como scanfy printfen realidad son envoltorios de funciones como fscanfy fprintf, con el puntero de ARCHIVO establecido en entrada estándar y salida estándar respectivamente. ¿Se garantiza que esto sea cierto para todas las implementaciones de C, o es una característica de una implementación específica? No puedo encontrar ninguna respuesta definitiva a esta pregunta, de una forma u otra.


Solución del problema

Es más probable que sean envoltorios vfscanf()y vfprintf(), porque la implementación 'obvia' es:

int scanf(const char * restrict fmt,...)
{
va_list args;
va_start(args, fmt);
int rv = vfscanf(stdin, fmt, args);
va_end(args);
return rv;
}
int printf(const char * restrict fmt,...)
{
va_list args;
va_start(args, fmt);
int rv = vfprintf(stdout, fmt, args);
va_end(args);
return rv;
}

Sin embargo, ciertamente es cierto en el nivel de llamada que estos son equivalentes:

printf("The data is %d, %d, %d\n", i, j, k);
fprintf(stdout, "The data is %d, %d, %d\n", i, j, k);

y también lo son estos:

int rv = scanf("%d %d %d", &i, &j, &k);
int rv = fscanf(stdin, "%d %d %d", &i, &j, &k);

Esta bien podría ser la razón por la que se afirma que scanf()es un envoltorio fscanf(), y printf()es un envoltorio fprintf(), pero cuando realmente tiene que entrar en los detalles esenciales de cómo implementarlo, debe escribir un código similar al que le mostré. crear código portátil. Puede haber atajos específicos del compilador que podría tomar una implementación de biblioteca, pero es relativamente poco probable que se usen.

Supongo que otra opción es una implementación macro:

#define printf(...) fprintf(stdout, __VA_ARGS__)
#define scanf(...) fscanf(stdin, __VA_ARGS__)

Sin embargo, la implementación también debe proporcionar una función real printf()y una función real scanf()para cumplir con los requisitos del estándar; consulte §7.1.4 Uso de funciones de biblioteca.

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...