Entrada/saída de arquivo estilo C --- entrada/saída não formatada ---(std::getchar, std::putchar, std::ungetc)

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 chem 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 strmais o caractere de nova linha anexado '\n' no fluxo de saída stdout, como se fosse escrito em execuções repetidas de std::putc.

strO 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 stdouto indicador de erro (consulte std::ferror()).

Perceber

std::putsA 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 chnão for igual a EOF, envie o caractere ch(traduzido para unsigned char) no streambuffer de entrada associado ao stream de forma que streamas 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 ungetcmais 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 ungetcobterá os caracteres reproduzidos na ordem inversa de.

Se chfor igual a EOF, a operação falhará sem afetar o fluxo.

Uma ungetcchamada bem-sucedida para limpar o sinalizador de status de fim de arquivo std::feof.

Uma chamada bem-sucedida em um fluxo binário ungetcdiminui 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 ungetcmodifica 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 ungetcvalor 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;
}

saída

Acho que você gosta

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