【问题标题】:ios::nocreate error while compiling a C++ code编译 C++ 代码时出现 ios::nocreate 错误
【发布时间】:2009-06-30 10:13:23
【问题描述】:

同时,编译一个包,在 RHEL 5.0 上用 C++ 编写。我收到以下错误。

> 错误:nocreate 不是std::ios 的成员

源码对应:

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


我试过了

#g++ -O -Wno-deprecated -o

还有:

#g++ -O -o

请提出解决方案。

【问题讨论】:

    标签: c++ linux g++ iostream


    【解决方案1】:

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

    编辑:从谷歌看来,如果文件不存在,它似乎是为了防止创建文件。无论如何,这是 ifstreams 的默认设置,所以你可以说:

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

    【讨论】:

    • 我正在构建一个开源包,并且正在抛出此错误。他们没有多少支持因此想知道。
    • "ios::nocreate 不是标准 C++ 的一部分 - 你希望它做什么?" - 认真的吗?
    • 这是有问题的,因为它引入了竞态条件:另一个进程可以在两个打开的语句之间创建文件。
    【解决方案2】:

    如果文件不存在,则以读取模式 (ios::in) 打开文件不会创建它。你可以不使用非标准的nocreate。因为inifstream 的默认值:

    ifstream tempStr (argv[4]);
    

    【讨论】:

    • 这是有问题的,因为它引入了竞态条件:另一个进程可以在两个打开的语句之间创建文件。
    【解决方案3】:

    您可以使用 fopen 和 O_CREAT|O_EXCL 将文件作为文件句柄打开,然后使用

    将其转换为流
    __gnu_cxx::stdio_filebuf<char> filebuf(posix_handle, std::ios::out);
        ostream os(&filebuf);
    

    这使用了定义在 . 如果有人有更好的解决方案,我真的很想知道!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多