2009-06-30 7 views
4

Lors de la compilation d'un package, écrit en C++ sur RHEL 5.0. Je reçois l'erreur suivante.ios :: nocreate erreur lors de la compilation d'un code C++

> Erreur: nocreate est pas membre de std::ios

Le code source correspond à:

ifstream tempStr(argv[4] , ios::in | ios::nocreate);


J'ai essayé

#g++ -O -Wno-deprecated <file.cpp> -o <file>

ainsi que :

#g++ -O -o <file>

Veuillez suggérer une solution.

Répondre

8

ios::nocreate ne fait pas partie de la norme C++ - qu'est-ce que vous attendez de faire? Edit: À partir d'un Google, il semble que l'intention était d'empêcher la création du fichier s'il n'existait pas déjà. Ceci est la valeur par défaut pour ifstreams de toute façon, vous pouvez simplement dire:

ifstream f(filename); 
if (! f.is_open()) { 
    // open failed - probably because infput file does not exist 
} 
+0

Je construis un paquet open source, et cette erreur est lancée. Pas beaucoup de soutien est disponible par eux, donc voulu savoir. –

+0

"ios :: nocreate ne fait pas partie du standard C++ - qu'est-ce que vous attendez de lui?" - sérieusement? – jww

+0

Ceci est problématique, car il introduit un racecondition: Un autre processus pourrait créer le fichier entre les deux déclarations ouvertes. – xophos

7

Ouverture d'un fichier en mode lecture (ios::in) ne crée pas si elle n'existe pas. Vous pouvez simplement laisser le non-standard nocreate. Et puisque in est la valeur par défaut pour ifstream:

ifstream tempStr (argv[4]); 
+0

Ceci est problématique, car il introduit un racecondition: Un autre processus pourrait créer le fichier entre les deux déclarations ouvertes. – xophos

0

Vous pouvez ouvrir le fichier en tant que descripteur de fichier en utilisant fopen et O_CREAT | O_EXCL puis le convertir en un flux en utilisant

__gnu_cxx::stdio_filebuf<char> filebuf(posix_handle, std::ios::out); 
    ostream os(&filebuf); 

celui-ci utilise une norme non extension définie dans. Si quelqu'un a une meilleure solution, je veux vraiment savoir!

Questions connexes