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::feof
zé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::feof
qu'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 feof
std::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 :
s
Le contenu de la chaîne d'octets terminée par un caractère nul pointée est suivi de " : " (sauf s'ils
s'agit d'un pointeur nul ou sis
le caractère pointé par est un caractère nul)- Une
errno
chaî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;
}