在使用Java进行编码的长时间休息后,我开始再次使用C ++。我正在尝试将我拥有的数据处理作业转换为C ++。我在尝试打开并一次写入100多个文件时遇到了问题(按日期将10GB文本文件拆分为文件)。再说一次,我现在只回到C ++大约2天了,所以我已经完成了我的代码充满了其他问题,但我已经创建了最简单的代码片段来显示问题。
导致这种情况的原因是什么?
#include <map>
#include <sstream>
int main() {
std::map<int, FILE*> files;
int files_to_open = 200;
int files_to_write = 200;
// Open a set of files.
for(int i = 0; i < files_to_open; i++) {
std::ostringstream file_path;
file_path << "E:\\tmp\\file_" << i << ".txt";
files[i] = fopen(file_path.str().c_str(), "w");
}
// Write data to files.
for(int i = 0; i < files_to_write; i++) {
printf("%d\n", i);
fwrite("Some Data", sizeof(char), 9, files[i]);
}
// Close files.
for (auto& file : files) {
fclose(file.second);
}
// End it all.
printf("Press Any Key to Continue\n");
getchar();
return 0;
}
答案 0 :(得分:1)
我将假设当files_to_write为&gt;时,fopen返回NULL
。 125.你的操作系统每个进程都有一个限制,它可以打开文件句柄的数量,你可能已经达到了限制。
125非常有意义,因为你已经有0(stdin),1(stdout)和2(stderr),所以125更多就是128这是一个很好的限制。
无论哪种方式,您应该在盲目地写fopen
之前检查FILE*
的返回值