l'exemple de code est comme ceci:pourquoi fstream zéro errno dans la fonction destructor
void testFuncErrno()
{
fstream fstr;
fstr.exceptions(std::ifstream::failbit | std::ifstream::badbit);
try
{
fstr.open("/mnt/virtualfs/test.ss", ofstream::out);
fstr << "test" << endl;
}
catch(std::ifstream::failure e)
{
cout << "func catch errno is:" << errno << ":" << strerror(errno) << endl;
cout << "good?" << (fstr.good()?"yes":"no") << endl;
}
}
int main(int argc, char *argv[])
{
try
{
errno = 0;
testFuncErrno();
cout << "0 st errno is:" << errno << ":" << strerror(errno) << endl;
}
catch(std::ifstream::failure e)
{
cout << "catch errno is:" << errno << ":" << strerror(errno) << endl;
}
pause();
return 0;
}
lorsque le disque est plein, je veux attraper le errno, mais il semble que le errno sera mis à zéro lorsque la fonction terminée. J'utilise ddd pour tracer le code source, et a trouvé quelques commentaires ci-dessous, mais de la description de errno:
errno est mis à zéro au démarrage du programme, et toute fonction de la bibliothèque standard C peut modifier sa valeur à certains valeur différente de zéro, généralement pour signaler des catégories d'erreurs spécifiques (aucune fonction de bibliothèque ne remet sa valeur à zéro une fois modifiée).
cela me fait un peu confuse, pourquoi la fermeture va mettre errno à zéro?
__basic_file<char>*
__basic_file<char>::close()
{
__basic_file* __ret = static_cast<__basic_file*>(NULL);
if (this->is_open())
{
int __err = 0;
if (_M_cfile_created)
{
**// In general, no need to zero errno in advance if checking
// for error first. However, C89/C99 (at variance with IEEE
// 1003.1, f.i.) do not mandate that fclose must set errno
// upon error.**
errno = 0;
do
__err = fclose(_M_cfile);
while (__err && errno == EINTR);
}
_M_cfile = 0;
if (!__err)
__ret = this;
}
return __ret;
}
bien, je teste également la fonction de fstream :: close() dans un cas normal, et il ne réglez le errno à zéro. Mais je dois attraper cette errno dans mon programme pour envoyer l'erreur de manquer de l'espace disque. – aldam70