Entrée/sortie de fichier de style C --- gestion des erreurs --- (std :: clearerr, std :: feof, std :: ferror, std :: perror)

Le sous-ensemble CI/O de la bibliothèque standard C++ implémente des opérations d'entrée/sortie de flux de style C. Le fichier d'en-tête <cstdio> fournit une prise en charge générale des fichiers et fournit des fonctions avec des capacités d'entrée/sortie de caractères étroits et multioctets, tandis que le fichier d'en-tête <cwchar> fournit des fonctions avec des capacités d'entrée/sortie de caractères larges.

La gestion des erreurs

effacer les erreurs

std::clearerr

void clearerr( std::FILE* stream );

Réinitialise les drapeaux et indicateurs d'erreur pour le flux de fichiers donné EOF.

paramètre

flux - Flux de fichiers pour réinitialiser les indicateurs d'erreur

valeur de retour

(aucun)

Exemple d'appel

#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;
}

sortir

Vérifier la fin du fichier

std::feof

int feof( std::FILE* stream );

Vérifie si la fin du flux de fichiers donné a été atteinte.

paramètre

flux - flux de fichiers à vérifier

valeur de retour

Différent de zéro si la fin du flux du fichier a été atteinte, 0 sinon.

Avis

Cette fonction signale uniquement l'état du flux signalé par l'opération d'E/S la plus récente ; elle n'examine pas la source de données associée. Par exemple, si l'E/S la plus récente était std::fgetc renvoyant le dernier octet du fichier, std::feofzéro est renvoyé. Le prochain std::fgetc échoue et modifie le flux de fichier en end-of-file . Ce n'est qu'après cela std::feofqu'il renvoie une valeur différente de zéro.

Dans une utilisation typique, le flux d'entrée arrête le traitement en cas d'erreur ; utilisez ensuite feofstd::ferror et std::ferror pour distinguer différentes conditions d'erreur.

Exemple d'appel

#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;
}

 sortir

Vérifier le fichier pour les erreurs

std::ferror

int ferror( std::FILE* stream );

Vérifiez le flux donné pour les erreurs.

paramètre

flux - flux de fichiers à vérifier

valeur de retour

Différent de zéro si le flux de fichiers a rencontré une erreur, 0 sinon.

Exemple d'appel

#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;
}

sortir

Afficher la chaîne correspondant à l'erreur actuelle sur stderr

std::perror

void perror( const char *s);

Imprimez le code d'erreur actuellement stocké dans la variable système errno sur stderr.

Une description est construite en connectant les composants suivants :

  • sLe contenu de la chaîne d'octets terminée par un caractère nul pointée est suivi de " : " (sauf s'il ss'agit d'un pointeur nul ou si sle caractère pointé par est un caractère nul)
  • Une errnochaîne de message d'erreur définie par l'implémentation décrivant le code d'erreur stocké dans suivi de « \n ». La chaîne du message d'erreur est équivalente au résultat de std::strerror(errno).

paramètre

s - Pointeur vers une chaîne terminée par un caractère nul contenant un message explicatif

valeur de retour

(aucun)

Exemple d'appel

#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;
}

sortir

Je suppose que tu aimes

Origine blog.csdn.net/qq_40788199/article/details/132947978
conseillé
Classement