Entrada/salida de archivos estilo C --- entrada/salida sin formato --- (std::getchar, std::putchar, std::ungetc)

El subconjunto CI/O de la biblioteca estándar de C++ implementa operaciones de entrada/salida de flujo de estilo C. El archivo de encabezado <cstdio> proporciona soporte general de archivos y proporciona funciones con capacidades de entrada/salida de caracteres estrechos y multibyte, mientras que el archivo de encabezado <cwchar> proporciona funciones con capacidades de entrada/salida de caracteres amplios.

Entrada/salida sin formato

Leer caracteres de stdin

std::getchar

int getchar();

Lea el siguiente carácter de stdin.

Equivalente a std::getc(stdin).

parámetro

(ninguno)

valor de retorno

El personaje obtenido en caso de éxito y EOF en caso de fracaso.

Si una condición de fin de archivo causa una falla, el indicador de fin de archivo en stdin se configura adicionalmente (consulte feof()). Si algún otro error causó la falla, se establece el indicador de error en la entrada estándar (consulte ferror()).


Escribir caracteres en la salida estándar

std::putchar

int putchar(int ch);

Escribe caracteres chen stdout. Internamente, los caracteres se convierten a caracteres sin firmar justo antes de escribirlos.

Equivalente a putc(ch, stdout).

parámetro

ch - personajes para escribir

valor de retorno

En caso de éxito, devuelve el carácter escrito.

En caso de error, devuelve EOF y establece el indicador de error en la salida estándar (ver errorr()).

Ejemplo de llamada

#include <cstdio>

int main(void)
{
    while (true)
    {
        char c = std::getchar();
        std::putchar(c);
    }
    return 0;
}

producción

Escribir cadena en stdout

int puts( const char *str );

Escribe cada carácter de la cadena terminada en nulo strmás el carácter de nueva línea agregado '\n' en el flujo de salida stdout, como si estuviera escrito en ejecuciones repetidas de std::putc.

strEl carácter de terminación nula de no está escrito .

parámetro

cadena - cadena para escribir

valor de retorno

Devuelve un valor no negativo en caso de éxito.

En caso de error, devuelve EOF y establece stdoutel indicador de error (consulte std::ferror()).

Aviso

std::putsLa función agrega un carácter de nueva línea a la salida, mientras que std::fputs no hace esto.

Diferentes implementaciones devuelven diferentes números no negativos: algunas devuelven el último carácter escrito, otras devuelven el número de caracteres escritos (o lo devuelven si la cadena es más larga que INT_MAX) y algunas simplemente devuelven una constante no negativa.

Una causa típica de falla al redirigir stdout a un archivo std::putses quedarse sin espacio en el sistema de archivos.

Ejemplo de llamada

#include <cstdio>

int main()
{
    int rc = std::puts("Hello World");

    if (rc == EOF)
    {
        std::perror("puts()");    // POSIX 要求设置 errno
    }
    return 0;
}

producción

volver a poner caracteres en la secuencia de archivos

std::ungetc

int ungetc( int ch, std::FILE *flujo );

Si no es igual a EOF, el carácter (traducido a carácter sin firmar) chse inserta en el búfer de entrada asociado con la secuencia de tal manera que las operaciones de lectura posteriores obtengan el carácter. Los dispositivos externos asociados con la transmisión no se modifican.chstreamstream

Los efectos de las operaciones de búsqueda de flujo std::fseek, std::fsetpos y std::rewind se descartan ungetc.

Si se llama ungetcmás de una vez sin lecturas intermedias o bits de recuperación, puede fallar (en otras palabras, se garantiza un búfer de reproducción de tamaño 1, pero cualquier búfer mayor está definido por la implementación). Si tiene éxito varias veces ungetc, la operación de lectura ungetcobtiene los caracteres reproducidos en el orden inverso a.

Si ches igual a EOF, la operación falla sin afectar la secuencia.

Una ungetcllamada exitosa para borrar el indicador de estado de fin de archivo std::feof.

Una llamada exitosa a una secuencia binaria ungetcdisminuye el indicador de posición de la secuencia en uno (el comportamiento no está definido si el indicador de posición de la secuencia es cero).

Una llamada exitosa a en una secuencia de texto ungetcmodifica el indicador de posición de la secuencia de una manera no especificada, pero garantiza que después de que se hayan obtenido todos los caracteres de reproducción con una operación de lectura, el indicador de posición de la secuencia sea igual a su ungetcvalor antes.

parámetro

ch - Caracteres para insertar en el búfer de flujo de entrada
arroyo - La secuencia de archivos en la que se deben reproducir los caracteres.

valor de retorno

Devuelto en caso de éxito ch.

Devuelve EOF en caso de error, dejando la secuencia dada sin cambios.

Aviso

En la práctica, el tamaño del buffer de reproducción varía entre 4k (Linux, MacOS) y 4 (Solaris) o el mínimo garantizado de 1 (HPUX, AIX).

El tamaño aparente del búfer de reproducción puede ser mayor si el carácter reproducido es igual al carácter presente en esa posición en la secuencia de caracteres externa (implementando un indicador de posición de archivo que puede simplemente disminuir la lectura y evitar mantener el búfer de reproducción).

Ejemplo de llamada

#include <cctype>
#include <cstdio>

void demo_scanf(const char* fmt, std::FILE* s)
{
    if (*fmt == '%')
    {
        switch (*++fmt)
        {
        case 'u':
        {
            int c;
            while (std::isspace(c = std::getc(s))) {} // 跳过前导空白
            unsigned int num = 0;
            while (std::isdigit(c))
            {
                num = num * 10 + c - '0';
                c = std::getc(s);
            }
            std::printf("%%u scanned %u\n", num);
            std::ungetc(c, s); // 重处理非数位
        }
        case 'c':
        {
            int c = std::getc(s);
            std::printf("%%c scanned '%c'\n", c);
        }
        }
    }
}

int main()
{
    std::FILE* file = std::fopen("input.txt", "w+");
    std::fputs("123x", file);
    std::rewind(file);
    demo_scanf("%u%c", file);
    std::fclose(file);
    return 0;
}

producción

Supongo que te gusta

Origin blog.csdn.net/qq_40788199/article/details/132790982
Recomendado
Clasificación