以下代码尝试在./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;
}
答案 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文件句柄,其中有更高的限制。