C size\u t或long表示包含文件的字符串的大小?

C size\u t或long表示包含文件的字符串的大小?,c,file-io,malloc,unix,C,File Io,Malloc,Unix,假设我想读取内存中的整个文件。我将以二进制模式打开它,使用fseek到达文件的末尾,然后使用ftell获取其大小。 然后我会分配一个与文件大小相同的字符串,然后将其读入,对吗 问题是ftell返回一个long int,malloc应该接收一个size\u t参数。现在,据我所知,size\u t可以大于long int,我刚刚检查了Harbison和Steele的参考手册C:a,第11章提到size\u t可以定义为无符号long long,这取决于编译器。我想相反的可能是真的,这将是一个真正的

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

问题是ftell返回一个long int,malloc应该接收一个size\u t参数。现在,据我所知,size\u t可以大于long int,我刚刚检查了Harbison和Steele的参考手册C:a,第11章提到size\u t可以定义为无符号long long,这取决于编译器。我想相反的可能是真的,这将是一个真正的问题,因为我会把一个长的投进一个长的,或者类似的东西

所以我的问题是我该怎么处理

谢谢


编辑:谢谢你们,真的很快!我也将使用mmap和posix_madvise,这是我在挖掘mmap信息后发现的

我想你应该改用mmap

我认为铸造的问题没有意义。由于两者中较小的long,如果有符号,则最大值为+2^31,如果一次读取所有这些内容,将占用2GB的内存。这通常不是一个好主意。

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


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

正确的处理方法是跳过以上所有内容,并根据您的操作系统使用mmap或CreateFileMapping/MapViewOfFile。此处的mmap不正确,因为字符串不会以null结尾。好吧,除了文件大小正好是操作系统页面大小的倍数的情况,在这种特定情况下,您的程序将在映射后崩溃或随机读入其他内存。使用以null结尾的字符串来处理磁盘文件中的字节的假设很可能是错误的,尤其是当二进制这个词出现时。除非文件恰好是一个序列化的以null结尾的字符串,否则通常不可能获取这些字节并将其视为以null结尾的字符串,无论是通过mmap还是通过任何其他读取文件的方式。事实上,如果您这样做,它很可能会比您的实际文件大小短得多,因为在文件的最后一个字节之前的某个点上可能会有一个空字节。