文件创建并不总是成功

时间:2017-06-25 13:45:53

标签: c++ temporary-files mkstemp

我需要在/tmp路径中创建1000个临时文件。下面是我使用mkstemp(来自竞争条件的安全)的方法,但文件创建仅限于500,其余的都失败。

std::string open_temp(std::string path, std::ofstream& f) {
    path += "/preXXXXXX";
    std::vector<char> dst_path(path.begin(), path.end());
    dst_path.push_back('\0');

    int fd = mkstemp(&dst_path[0]);
    if(fd != -1) {           //fail condition 
        std::cout<<"not created count = "<<j++<<std::endl;
        // j = 500 why fail it gloabl varibale?
        path.assign(dst_path.begin(), dst_path.end() - 1);
        f.open(path.c_str(),
               std::ios_base::trunc | std::ios_base::out);
        close(fd);
    }
    return path;
}

int main() {
    std::ofstream logfile;
    for(int i=0;i<1000;i++)
    {
        std::cout<<"count = "<<i++ <<std::endl;
        open_temp("/tmp", logfile);
        // ^^^ calling 1000 times but only 500 sucess which is that?
        if(logfile.is_open()) {
            logfile << "testing" << std::endl;
        }
    }
}

注意:我在完成工作后删除了文件。

有人可以解释为什么这种方法会失败并建议一个更好的方法吗?

1 个答案:

答案 0 :(得分:1)

std::cout<<"count = "<<i++ <<std::endl;
                       ^^^

您还在i循环中增加for。 结果我从0到2,4,6,8等等,循环只运行500次。 将其更改为std::cout<<"count = "<<i <<std::endl;,看看情况如何......

此外,我发现您上面也在j++,但我看不到j的定义位置?