emplace_back + ofstream + windows - >错误?

时间:2015-12-18 20:35:51

标签: c++

以下代码尝试在./out文件夹中创建800个文件。在Linux Debian上使用g ++ 4.9.2,程序可以正常工作。但是在带有g ++ 5.2.0(MinGW)的Windows 7或8上,程序停止在509个文件中。该错误似乎是在类Task的构造函数中使用emplace_back和ofstream的组合。是bug吗?

//g++ -std=c++11 main.cpp
#include <sstream>
#include <fstream>
#include <list>
#include <iostream>

#ifdef _WIN32
    #include <io.h>
#else
    #include <sys/stat.h>
#endif

using namespace std;

int i;

struct Task
{
    ofstream out;
    Task(string file_name): out(file_name)
    {
        if(!out) {cout<<i<<"\n"; exit(1);}
    }
};

int main()
{       
    #ifdef _WIN32
        string output_folder = ".\\out";
        mkdir(output_folder.c_str());
        output_folder+="\\";
    #else
        string output_folder = "./out";
        mkdir(output_folder.c_str(),S_IRWXU);
        output_folder+="/";
    #endif

    list<Task> ltask;
    for(i=0; i<800; i++)
    {
        ostringstream os;
        os<<output_folder<<i;
        ltask.emplace_back(os.str());
    }
    return 0;
}

2 个答案:

答案 0 :(得分:3)

这是对打开文件数量的限制(在Windows或运行时库或其他地方)...使用以下代码更改上面代码中的循环会产生相同的结果:

list<ofstream*> l;
for(i=0; i<800; i++)
{
    ostringstream os;
    os<<output_folder<<i;
    l.push_back(new ofstream(os.str()));
}
for(auto p: l) delete p;

答案 1 :(得分:0)

请参阅this question

CRT(由C ++标准库使用)默认情况下具有512个同时打开的文件描述符的限制。你使用3代表stdin,stdout和stderr,它们留下509.(你的任务不只是创建文件;它们会让它们保持打开状态。)

如果你在创建文件后关闭文件,你会没事的。您也可以提高限制(在另一个问题中解释)或使用Windows文件句柄,其中有更高的限制。