ifstream: comment savoir si le fichier spécifié n'existe pas

Je veux ouvrir un fichier pour la lecture. Cependant, dans le contexte de ce programme, C'est OK si le fichier n'existe pas, je passe à autre chose. Je veux être en mesure de déterminer quand l'erreur "fichier non trouvé" et quand l'erreur est ailleurs. Autrement signifie que je dois quitter et erreur.

Je ne vois pas un moyen évident de le faire avec fstream.


Je peux le faire avec C open() et perror(). Je suppose qu'il y avait un moyen fstream de le faire aussi.

36
demandé sur Yu Hao 2009-10-30 04:33:05

9 réponses

Puisque le résultat de l'ouverture d'un fichier est spécifique au système D'exploitation, Je ne pense pas que le C++ standard ait un moyen de différencier les différents types d'erreurs. Le fichier s'ouvre ou non.

Vous pouvez essayer d'ouvrir le fichier pour la lecture, et s'il ne s'ouvre pas, vous savez qu'il n'existe pas ou qu'une autre erreur s'est produite. Là encore, si vous essayez de l'ouvrir pour l'écrire ensuite et qu'il échoue, cela pourrait tomber dans la catégorie" autre chose".

7
répondu Cogwheel 2009-10-30 01:37:00

EDIT: j'ai été informé que cela n'indique pas nécessairement qu'un fichier n'existe pas, car il peut également être signalé en raison d'autorisations d'accès ou d'autres problèmes.

Je sais que je suis extrêmement en retard pour répondre à cela, mais j'ai pensé que je laisserais un commentaire de toute façon pour quiconque navigue. Vous pouvez utiliser l'indicateur d'échec d'ifstream pour indiquer si un fichier existe.

ifstream myFile("filename.txt");
    if(myFile.fail()){
        //File does not exist code here
    }
//otherwise, file exists
47
répondu SwarthyMantooth 2015-01-13 17:42:04

Je ne pense pas que vous puissiez savoir si "le fichier n'existe pas". Vous pouvez utiliser is_open () pour la vérification Générique:

ofstream file(....);
if(!file.is_open())
{
  // error! maybe the file doesn't exist.
}

Si vous utilisez boost vous pouvez utiliser boost::filesystem:

#include <boost/filesystem.hpp>
int main()
{
    boost::filesystem::path myfile("test.dat");

    if( !boost::filesystem::exists(myfile) )
    {
        // what do you want to do if the file doesn't exist 
    }
}
38
répondu AraK 2013-07-11 09:36:03

Vous pouvez utiliser stat, qui doit être portable sur toutes les plates-formes et se trouve dans la bibliothèque C standard:

#include <sys/stat.h>

bool FileExists(string filename) {
    struct stat fileInfo;
    return stat(filename.c_str(), &fileInfo) == 0;
}

Si stat renvoie 0, le fichier (ou le répertoire) existe, sinon ce n'est pas le cas. je suppose que vous devrez avoir des autorisations d'accès sur tous les répertoires du chemin du fichier. Je n'ai pas testé la portabilité, mais cette page suggère que cela ne devrait pas être un problème.

5
répondu Erik Garrison 2010-06-18 16:42:42

Un moyen simple de http://www.cplusplus.com/forum/general/1796/

ifstream ifile(filename);
if (ifile) {
  // The file exists, and is open for input
}
4
répondu LI Xuhong 2016-09-04 10:33:50

Une meilleure façon:

std::ifstream stream;
stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
stream.open(fileName, std::ios::binary);
1
répondu user1633272 2018-06-13 15:25:58

La fonction std::fstream::good() retourne false lorsque le fichier n'existe pas. Est pas assez?

std::fstream hérite cette fonction à partir de std::ios.

0
répondu Curious 2017-08-03 11:50:27

Donnons-moi un exemple avec Real running:

  1. le fichier n'existe pas:

entrez la description de l'image ici

  1. fichier existe:

entrez la description de l'image ici

Voir http://www.cplusplus.com/reference/fstream/ifstream / pour plus d'informations sur sa fonction publique.

0
répondu Jayhello 2018-07-12 08:48:20

Manière directe sans créer d'objet ifstream.

if (!std::ifstream(filename))
{
     // error! file doesn't exist.
}
0
répondu impulse 2018-08-26 10:04:18