O subconjunto CI/O da biblioteca padrão C++ implementa operações de entrada/saída de fluxo no estilo C. O arquivo de cabeçalho <cstdio> fornece suporte geral a arquivos e fornece funções com recursos de entrada/saída de caracteres estreitos e multibyte, enquanto o arquivo de cabeçalho <cwchar> fornece funções com amplos recursos de entrada/saída de caracteres.
E/S não formatada
Ler caracteres de stdin
std::getchar
int getchar(); |
Leia o próximo caractere de stdin.
Equivalente a std::getc(stdin).
parâmetro
(nenhum)
valor de retorno
O personagem obtido em caso de sucesso e EOF em caso de falha.
Se uma condição de fim de arquivo causar falha, o indicador de fim de arquivo em stdin será definido adicionalmente (consulte feof()). Se algum outro erro causou a falha, o indicador de erro em stdin é definido (veja ferror()).
escrever caracteres no stdout
std::putchar
int putchar(int ch); |
Escreva caracteres ch
em stdout
. Internamente, os caracteres são convertidos em caracteres não assinados antes de serem escritos.
Equivalente a putc(ch, stdout).
parâmetro
CH | - | caracteres para escrever |
valor de retorno
Em caso de sucesso, retorna o caractere escrito.
Em caso de falha, retorna EOF e define o indicador de erro em stdout (consulte ferror()).
exemplo de chamada
#include <cstdio>
int main(void)
{
while (true)
{
char c = std::getchar();
std::putchar(c);
}
return 0;
}
saída
escrever string em stdout
int puts( const char *str );
Grava cada caractere da string terminada em nulo str
mais o caractere de nova linha anexado '\n' no fluxo de saída stdout
, como se fosse escrito em execuções repetidas de std::putc.
str
O caractere de terminação nulo de não está escrito .
parâmetro
str | - | a string a ser escrita |
valor de retorno
Retorna um valor não negativo em caso de sucesso
Em caso de falha, retorna EOF e define stdout
o indicador de erro (consulte std::ferror()).
Perceber
std::puts
A função anexa um caractere de nova linha à saída, enquanto std::fputs não faz isso.
Diferentes implementações retornam diferentes números não negativos: algumas retornam o último caractere escrito, algumas retornam o número de caracteres escritos (ou o retornam se a string for maior que INT_MAX) e algumas simplesmente retornam uma constante não negativa.
Uma causa típica de falha ao redirecionar stdout para um arquivo std::puts
é a falta de espaço no sistema de arquivos.
exemplo de chamada
#include <cstdio>
int main()
{
int rc = std::puts("Hello World");
if (rc == EOF)
{
std::perror("puts()"); // POSIX 要求设置 errno
}
return 0;
}
saída
colocar caracteres de volta no fluxo de arquivos
std::ungetc
int ungetc( int ch, std::FILE *stream ); |
Se ch
não for igual a EOF, envie o caractere ch
(traduzido para unsigned char) no stream
buffer de entrada associado ao stream de forma que stream
as operações de leitura subsequentes obtenham o caractere. Os dispositivos externos associados ao stream não são modificados.
Os efeitos das operações de pesquisa de fluxo std::fseek, std::fsetpos e std::rewind são descartados ungetc
.
Se chamado ungetc
mais de uma vez sem leituras intermediárias ou bits de recuperação, ele pode falhar (em outras palavras, um buffer de reprodução de tamanho 1 é garantido, mas qualquer buffer maior é definido pela implementação). Se for bem-sucedida várias vezes ungetc
, a operação de leitura ungetc
obterá os caracteres reproduzidos na ordem inversa de.
Se ch
for igual a EOF, a operação falhará sem afetar o fluxo.
Uma ungetc
chamada bem-sucedida para limpar o sinalizador de status de fim de arquivo std::feof.
Uma chamada bem-sucedida em um fluxo binário ungetc
diminui o indicador de posição do fluxo em um (o comportamento é indefinido se o indicador de posição do fluxo for zero).
Uma chamada bem-sucedida em um fluxo de texto ungetc
modifica o indicador de posição do fluxo de uma maneira não especificada, mas garante que, após todos os caracteres de reprodução terem sido obtidos com uma operação de leitura, o indicador de posição do fluxo seja igual ao seu ungetc
valor antes.
parâmetro
CH | - | Caracteres a serem inseridos no buffer do fluxo de entrada |
fluxo | - | O fluxo de arquivos no qual os caracteres devem ser reproduzidos |
valor de retorno
Retornou em caso de sucesso ch
.
Retorna EOF em caso de falha, deixando o fluxo fornecido inalterado.
Perceber
Na prática, o tamanho do buffer de reprodução varia entre 4k (Linux, MacOS) e 4 (Solaris) ou o mínimo garantido de 1 (HPUX, AIX).
O tamanho aparente do buffer de reprodução pode ser maior se o caractere reproduzido for igual ao caractere presente naquela posição na sequência de caracteres externa (implementando um indicador de posição do arquivo que pode simplesmente diminuir a leitura e evitar a manutenção do buffer de reprodução).
exemplo de chamada
#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;
}