2009-06-30 16 views
4

Während kompilieren eines Pakets, geschrieben in C++ auf RHEL 5.0. Ich erhalte den folgenden Fehler.ios :: nocreate Fehler beim Kompilieren eines C++ Codes

> Fehler: nocreate ist kein Mitglied der std::ios

Der Source-Code entspricht:

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


I

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

auch versucht haben, wie :

#g++ -O -o <file>

Bitte schlagen Sie eine Lösung vor.

Antwort

8

ios::nocreate gehört nicht zum Standard C++ - was erwarten Sie von ihm?

Edit: Von einem Google scheint es zu verhindern, dass die Datei erstellt wird, wenn sie nicht bereits existiert. Dies ist die Standardeinstellung für ifstreams trotzdem, so kann man einfach sagen:

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

Ich baue ein Open-Source-Paket, und dieser Fehler wird ausgelöst. Es gibt nicht viel Unterstützung von ihnen. Daher wollte es wissen. –

+0

"ios :: nocreate ist nicht Teil von C++ - was erwarten Sie?" - ernst? – jww

+0

Dies ist problematisch, da es eine Racecondition einführt: Ein anderer Prozess könnte die Datei zwischen den beiden offenen Anweisungen erstellen. – xophos

7

eine Datei im Lesemodus öffnen (ios::in) wird es nicht schaffen, wenn sie nicht existiert. Sie können einfach den nicht standardmäßigen nocreate weglassen. Und da in ist die Standardeinstellung für ifstream:

ifstream tempStr (argv[4]); 
+0

Dies ist problematisch, da es eine Racecondition einführt: Ein anderer Prozess könnte die Datei zwischen den beiden offenen Anweisungen erstellen. – xophos

0

Sie die Datei als Dateihandle öffnen können mit fopen und O_CREAT | O_EXCL und wandeln sie dann in einen Stream mit

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

diese verwendet einen Nicht-Standard Erweiterung definiert in. Wenn jemand eine bessere Lösung hat, möchte ich es wirklich wissen!

Verwandte Themen