写入多个文件时崩溃

时间:2013-12-13 22:25:57

标签: c++

在使用Java进行编码的长时间休息后,我开始再次使用C ++。我正在尝试将我拥有的数据处理作业转换为C ++。我在尝试打开并一次写入100多个文件时遇到了问题(按日期将10GB文本文件拆分为文件)。再说一次,我现在只回到C ++大约2天了,所以我已经完成了我的代码充满了其他问题,但我已经创建了最简单的代码片段来显示问题。

  • 我可以将files_to_open更改为任何数字,我没有任何问题。
  • 如果files_to_write是< = 125则运行文件。
  • 如果files_to_write是> 125它崩溃了。

导致这种情况的原因是什么?

#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;  
}  

1 个答案:

答案 0 :(得分:1)

我将假设当files_to_write为&gt;时,fopen返回NULL。 125.你的操作系统每个进程都有一个限制,它可以打开文件句柄的数量,你可能已经达到了限制。

125非常有意义,因为你已经有0(stdin),1(stdout)和2(stderr),所以125更多就是128这是一个很好的限制。

无论哪种方式,您应该在盲目地写fopen之前检查FILE*的返回值