【问题标题】:fopen does not deal with more than 60 files at the same timefopen 不会同时处理超过 60 个文件
【发布时间】:2013-09-04 08:59:44
【问题描述】:

我需要在我的 C 程序中同时打开 60 多个文本文件。但是,似乎 fopen 无法同时处理超过 60 个文件。我在 Windows 环境下编程。

我使用下面的 fopen 语句:

fopen(fileName.c_str(),"wt");

其中 fileName 是我的 txt 文件的路径,名称在 100 个文件的循环内更改。有谁知道使这项工作的任何技巧?还是有其他选择?

【问题讨论】:

  • 首先,当fopen 失败时,您可能需要检查errno。另外,我猜你是在 Windows 上?
  • 为什么不能只打开几个最近使用的文件?然后关闭旧的并在必要时打开新的。
  • 是的,Joachim,我正在使用 Windows。我会试试 errno。
  • 也许这有帮助:stackoverflow.com/a/870224/694733
  • user694733,我的算法需要打开所有这些文件,所以我无法关闭它们。

标签: c windows file-io fopen


【解决方案1】:

如果你发出 bash shell 命令:

ulimit -n

您会看到 60 是您打开文件句柄的限制。你可以改变它:

ulimit -n 256

注意:您可以使用-Sn-Hn 看到软限制 (-S) 和硬限制 (-H),您可以将软限制更改为硬限制。

【讨论】:

  • 这也是我的猜测,但是 60(可能是 64)作为打开文件的限制是相当低的。例如我的 Linux 机器有 1024。
  • 对于我的 Mac 来说是 256,但在他的设备上它肯定会更低。
  • 我忘了说我在 Windows 中。里面怎么改?
【解决方案2】:

实际上有 两个 因素限制了您可以随时打开多少文件:

  1. ulimit -n指定的环境限制。
  2. C 运行时库。我知道有几个将您限制为 256 个文件句柄(以 Sun 为例)

考虑到 STDIN、STDOUT 和 STDERR 已经被打开,您当前的限制可能是 63,而且我不知道有这么低的系统,所以它可能是您的 ulimit但您需要注意其他限制。

在 Windows 上,您可以使用 _setmaxstdio(n),但在默认情况下,您仍然应该能够打开 512 个文件。所以我仍然有点困惑,为什么除非你打开每个文件大约 8 次,否则你只能得到 60 奇数......

【讨论】:

  • 汤姆,我的C运行库允许1024个文件,所以一定是环境限制。关于环境限制,用 ulimit -100 语句就够了吗?
  • 我不认为 ulimit 适用于 windows
  • 对不起,我的意思是 _setmaxstdio(n)。我会试试的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
相关资源
最近更新 更多