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 ch
en 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 str
má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.
str
El 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 stdout
el indicador de error (consulte std::ferror()).
Aviso
std::puts
La 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::puts
es 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) ch
se 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.ch
stream
stream
Los efectos de las operaciones de búsqueda de flujo std::fseek, std::fsetpos y std::rewind se descartan ungetc
.
Si se llama ungetc
má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 ungetc
obtiene los caracteres reproducidos en el orden inverso a.
Si ch
es igual a EOF, la operación falla sin afectar la secuencia.
Una ungetc
llamada exitosa para borrar el indicador de estado de fin de archivo std::feof.
Una llamada exitosa a una secuencia binaria ungetc
disminuye 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 ungetc
modifica 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 ungetc
valor 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;
}