代码之家  ›  专栏  ›  技术社区  ›  Akusete

C++ STD:MACOS上的FSCAN行为

  •  0
  • Akusete  · 技术社区  · 17 年前

    在使用gcc4.2的MacOS上,如果不存在文件,以下代码是否应创建新文件?

    #include <fstream>
    
    void test () {
        std::fstream file ("myfile.txt", std::ios::in | std::ios::out);
    }
    

    按照我的逻辑,它应该打开一个现有文件进行读/写,或者创建一个新的空文件进行读/写。但我得到的行为是,如果“myfile.txt”不存在,它将不会创建新文件。

    #include <fstream>
    
    void test () {
        std::ofstream file ("myfile.txt", std::ios::in | std::ios::out);
    }
    

    截断现有文件。。。

    这是标准行为吗?

    2 回复  |  直到 17 年前
        1
  •  4
  •   Pavel Minaev    17 年前

    首先,我不知道你为什么这么想 fopen("r+") 根据ISO C&创建一个不存在的文件;C++,它不打开,它只打开一个现有的读/写文件。如果要使用创建文件 fopen ,你用 "w+" .

    对于流,您只需指定 trunc

    std::ofstream file ("myfile.txt",
        std::ios::in | std::ios::out | std::ios::trunc);
    

    然而,这和 fopen("w+") 将截断该文件。如果文件存在,没有标准的方法可以打开它而不截断它,但是如果在一次调用中它不存在,则可以创建它。您最多可以尝试打开、检查故障,然后尝试创建/截断;但如果文件是在检查之后但在截断之前由另一个进程创建的,则这可能会导致竞争条件。

    在POSIX中,您可以使用 open O_CREAT 没有 O_TRUNC

        2
  •  0
  •   Michael Aaron Safyan    17 年前