Entrada/saída de arquivo estilo C --- tratamento de erros --- (std::clearerr, std::feof, std::ferror, std::perror)

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.

Manipulação de erros

limpar erros

std::clearerr

void clearerr( std::FILE* stream );

Redefine sinalizadores e indicadores de erro para um determinado fluxo de arquivos EOF.

parâmetro

fluxo - Fluxo de arquivos para redefinir sinalizadores de erro

valor de retorno

(nenhum)

Exemplo de chamada

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    int ch = 0;
    FILE* fp = fopen("test.txt", "w");

    if (fp)
    {
        ch = std::getc(fp);
        std::printf("%c", ch);

        if (std::ferror(fp))
        {
            std::cout << "Error set" << std::endl;
            std::clearerr(fp);
        }
    }

    if (!std::ferror(fp))
    {
        std::cout << "Error reset" << std::endl;
    }

    std::fclose(fp);
    return 0;
}

saída

Verifique o final do arquivo

std::feof

int feof(std::FILE* fluxo);

Verifica se o fim de um determinado fluxo de arquivos foi atingido.

parâmetro

fluxo - fluxo de arquivos para verificar

valor de retorno

Diferente de zero se o final do fluxo de arquivos tiver sido atingido; 0 caso contrário.

Perceber

Esta função relata apenas o status do fluxo relatado pela operação de E/S mais recente; ela não examina a fonte de dados associada. Por exemplo, se a E/S mais recente foi std::fgetc retornando o último byte do arquivo, std::feofzero será retornado. O próximo std::fgetc falha e altera o fluxo do arquivo para end-of-file . Só depois disso std::feofele retorna diferente de zero.

No uso típico, o fluxo de entrada interrompe o processamento em qualquer erro; em seguida, use feofstd::ferror e std::ferror para distinguir diferentes condições de erro.

Exemplo de chamada

#include <cstdio>
#include <cstdlib>

int main()
{
    FILE* fp = std::fopen("test.txt", "r");
    if (!fp)
    {
        std::perror("File opening failed");
        return EXIT_FAILURE;
    }

    int c; // 注意:是 int 而非 char ,要求处理 EOF
    while ((c = std::fgetc(fp)) != EOF)   // 标准 C I/O 文件读取循环
    {
        std::putchar(c);
    }

    if (std::ferror(fp))
    {
        std::puts("I/O error when reading");
    }
    else if (std::feof(fp))
    {
        std::puts("End of file reached successfully");
    }

    std::fclose(fp);
    return 0;
}

 saída

Verifique se há erros no arquivo

std::ferror

int ferror( std::FILE* stream );

Verifique se há erros no fluxo fornecido.

parâmetro

fluxo - fluxo de arquivos para verificar

valor de retorno

Diferente de zero se o fluxo de arquivos encontrou um erro; 0 caso contrário.

Exemplo de chamada

#include <cstdio>
#include <cstdlib>
#include <clocale>
#include <cwchar>
#include <iostream>

int main(void)
{
    const char *fname = std::tmpnam(nullptr);
    std::cout << "fname:    " <<  fname << std::endl;
    std::FILE* f = std::fopen(fname, "wb");
    std::fputs("\xff\xff\n", f); // 不是合法的 UTF-8 字符序列
    std::fclose(f);

    std::setlocale(LC_ALL, "en_US.utf8");
    f = std::fopen(fname, "rb");
    std::wint_t ch;
    while ((ch = std::fgetc(f)) != WEOF) // 试图作为 UTF-8 读取
    {
        std::printf("%#x ", ch);
    }

    if (std::feof(f))
    {
        puts("EOF indicator set");
    }

    if (std::ferror(f))
    {
        puts("Error indicator set");
    }

    return 0;
}

saída

Exibir a string correspondente ao erro atual no stderr

std::perror

void erro( const char *s );

Imprima o código de erro atualmente armazenado na variável de sistema errno para stderr.

A descrição é construída conectando os seguintes componentes:

  • sO conteúdo da string de bytes terminada em nulo apontada é seguido por ":" (a menos que sseja um ponteiro nulo ou so caractere apontado por seja um caractere nulo)
  • Uma errnostring de mensagem de erro definida pela implementação que descreve o código de erro armazenado seguido por '\n'. A string da mensagem de erro é equivalente ao resultado de std::strerror(errno).

parâmetro

é - Ponteiro para uma string terminada em nulo que contém uma mensagem explicativa

valor de retorno

(nenhum)

Exemplo de chamada

#include <cmath>
#include <cerrno>
#include <cstdio>

int main()
{
    double not_a_number = std::log(-1.0);
    if (errno == EDOM)
    {
        std::perror("log(-1) failed");
    }
    return 0;
}

saída

Acho que você gosta

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