size_t或long为包含文件的字符串的大小?

时间:2010-09-29 19:37:42

标签: c file-io malloc unix

假设我想要读取内存中的整个文件。我将以二进制模式打开它,使用fseek到达文件的末尾,然后执行ftell以获取其大小。 然后我会分配一个与文件大小相同的字符串,然后阅读它,对吗?

问题是ftell会返回long intmalloc会收到size_t参数。现在,size_t 可以大于long int据我所知(我刚刚检查了 C:Harbison的参考手册和Steele和第11章提到size_t可以定义为unsigned long long,具体取决于编译器)。我认为相反的情况可能是正确的(这将是一个真正的问题,因为我会将long long投射到long,或类似的东西)

所以我的问题是我该如何处理?

谢谢!

编辑:谢谢大家,这真的很快!我也会使用mmap(以及posix_madvise,这是我在发现有关mmap的信息后发现的!

3 个答案:

答案 0 :(得分:3)

我认为您想要使用mmap()。

答案 1 :(得分:1)

我认为铸造问题没有实际意义。由于两者中的较小者long的最大值为+ 2 ^ 31(如果已签名),如果您一次性读取所有内容,则占用2GB内存。这通常是一个坏主意。

答案 2 :(得分:1)

如果您的文件足够大,可能会出现问题,那么它们也足够大,内存分配几乎肯定会失败。

要么不担心,要么切换到OS特定的内存映射技术。