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.
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".
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
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
}
}
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.
Un moyen simple de http://www.cplusplus.com/forum/general/1796/
ifstream ifile(filename);
if (ifile) {
// The file exists, and is open for input
}
Une meilleure façon:
std::ifstream stream;
stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
stream.open(fileName, std::ios::binary);
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
.
Donnons-moi un exemple avec Real running:
- le fichier n'existe pas:
- fichier existe:
Voir http://www.cplusplus.com/reference/fstream/ifstream / pour plus d'informations sur sa fonction publique.
Manière directe sans créer d'objet ifstream.
if (!std::ifstream(filename))
{
// error! file doesn't exist.
}