web-dev-qa-db-fra.com

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

Je veux ouvrir un fichier en lecture. Cependant, dans le contexte de ce programme, si le fichier n'existe pas, je peux passer à autre chose. Je veux être capable d'identifier quand l'erreur est "fichier non trouvé" et quand l'erreur est autrement. Sinon, je dois quitter et commettre une erreur.

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


Je peux le faire avec les noms open() et perror() de C. J'ai supposé qu'il y avait une manière fstream de le faire aussi.

38
Paul Nathan

Le résultat de l’ouverture d’un fichier étant spécifique à un système d’exploitation, je ne pense pas que le C++ standard permette de différencier les différents types d’erreurs. Le fichier est ouvert ou non.

Vous pouvez essayer d’ouvrir le fichier en 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 après pour écrire et que cela échoue, cela pourrait tomber dans la catégorie "autre chose".

7
Cogwheel

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

Je sais que je réponds très tard, mais je me suis dit que je laisserais un commentaire quand même pour tous les internautes. Vous pouvez utiliser l'indicateur d'échec d'ifstream pour savoir si un fichier existe. 

ifstream myFile("filename.txt");
    if(myFile.fail()){
        //File does not exist code here
    }
//otherwise, file exists
51
SwarthyMantooth

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 
    }
}
39
AraK

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

ifstream ifile(filename);
if (ifile) {
  // The file exists, and is open for input
}
6
LI Xuhong

Vous pouvez utiliser stat, qui devrait ê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 dans le 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
Erik Garrison

Une meilleure façon:

std::ifstream stream;
stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
stream.open(fileName, std::ios::binary);
1
user1633272

Droit sans créer d'objet ifstream.

if (!std::ifstream(filename))
{
     // error! file doesn't exist.
}
0
Arun

La fonction std::fstream::good() renvoie false pour plusieurs raisons, y compris lorsque le fichier n'existe pas. N'est-ce pas suffisant?

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

0
Curious