2010-09-29 29 views
2

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

问题是ftell返回long int,而malloc应该收到size_t参数。现在,size_t可以long int大,据我可以告诉(我刚刚检查C:一本参考手册由哈比森和斯蒂尔和第11章提到size_t可以定义为unsigned long long,取决于编译器)。我想相反可能是真实的(这将是一个真正的问题,因为我会投到long,或类似的东西)

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

谢谢!

编辑:谢谢你们,那真的很快!我将使用mmap(和posix_madvise,我在找到关于mmap的信息后发现它)!

+1

正确的处理方法是跳过上述所有内容,并使用'mmap'或'CreateFileMapping' /'MapViewOfFile'(取决于您的操作系统)。 – 2010-09-29 19:41:26

回答

3

我想你想用mmap()代替。

+1

'mmap'这里是不正确的,因为字符串不会以null结尾。那么除了在文件大小恰好是操作系统页面大小的倍数的情况下,在特定情况下,您的程序将在映射后崩溃或读入随机的其他内存。 – 2010-09-29 21:06:05

+1

假设使用以空字符结尾的字符串处理磁盘文件中的字节很可能是错误的,特别是当出现“binary”一词时。除非文件碰巧是一个序列化的以null结尾的字符串,否则通常无法获取这些字节并将它们视为以null结尾的字符串,无论是通过mmap还是通过读取文件的其他方式。实际上,如果这样做,它很可能看起来比实际文件大小要短得多,因为在文件的最后一个字节之前,文件中的某个点可能会有一个空字节。 – Nico 2010-09-30 14:42:02

1

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

1

如果你的文件足够大,这是一个问题,它们也足够大,内存分配几乎肯定会失败。

请不要担心它,或切换到操作系统特定的内存映射技术。

相关问题