假设我想要读取内存中的整个文件。我将以二进制模式打开它,使用fseek
到达文件的末尾,然后执行ftell
以获取其大小。
然后我会分配一个与文件大小相同的字符串,然后阅读它,对吗?
问题是ftell
会返回long int
,malloc
会收到size_t
参数。现在,size_t
可以大于long int
据我所知(我刚刚检查了 C:Harbison的参考手册和Steele和第11章提到size_t
可以定义为unsigned long long
,具体取决于编译器)。我认为相反的情况可能是正确的(这将是一个真正的问题,因为我会将long long
投射到long
,或类似的东西)
所以我的问题是我该如何处理?
谢谢!
编辑:谢谢大家,这真的很快!我也会使用mmap
(以及posix_madvise
,这是我在发现有关mmap
的信息后发现的!
答案 0 :(得分:3)
我认为您想要使用mmap()。
答案 1 :(得分:1)
我认为铸造问题没有实际意义。由于两者中的较小者long
的最大值为+ 2 ^ 31(如果已签名),如果您一次性读取所有内容,则占用2GB内存。这通常是一个坏主意。
答案 2 :(得分:1)
如果您的文件足够大,可能会出现问题,那么它们也足够大,内存分配几乎肯定会失败。
要么不担心,要么切换到OS特定的内存映射技术。