编译C++代码时出现ios::nocreate错误

5
在RHEL 5.0上编译一个C++包时,我遇到了以下错误:

> error: nocreate不是std::ios的成员

源代码对应于:

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


我尝试过:

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

以及:

#g++ -O -o <file>

请提供解决方案。

3个回答

9

ios::nocreate不是标准C++的一部分-你希望它做什么?

编辑:从Google上看,它旨在防止文件在不存在的情况下被创建。对于ifstreams来说,这已经是默认设置了,所以你只需要这样写:

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

我正在构建一个开源软件包,但出现了这个错误。他们提供的支持不太多,因此想知道一下。 - M.N
"ios::nocreate不是标准C++的一部分 - 你期望它做什么?" - 说真的? - jww
1
这是有问题的,因为它引入了竞态条件:另一个进程可能会在两个打开语句之间创建文件。 - xophos

7

以只读模式打开文件(ios::in)不会在文件不存在时创建它。您可以省略非标准的 nocreate。而且,由于 ifstream 的默认值是 in

ifstream tempStr (argv[4]);

这是有问题的,因为它引入了竞态条件:另一个进程可能会在两个打开语句之间创建文件。 - xophos

0

你可以使用 fopen 和 O_CREAT|O_EXCL 打开文件并将其转换为流。

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

这里使用了一个在标准中未定义的扩展。

如果有更好的解决方案,我真的很想知道!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接