使用以下命令打开文件后:
const char *fMode = "r";
FILE *filePointer = fopen(location,fMode);
获取其大小的最快跨平台(Windows 和 Linux)方法是什么,以便您可以使用分配适量的内存malloc
?
我已经看到ftell
只有在以二进制模式打开文件时才有效。
使用以下命令打开文件后:
const char *fMode = "r";
FILE *filePointer = fopen(location,fMode);
获取其大小的最快跨平台(Windows 和 Linux)方法是什么,以便您可以使用分配适量的内存malloc
?
我已经看到ftell
只有在以二进制模式打开文件时才有效。
您可以使用stat
或fstat
在打开文件之前找到大小。
我建议使用ftell
.
它不是 100% 准确,但已经足够好了。除非您正在处理每行只有一个或两个字符且行数很多的文件,否则开销可能并不重要(当然,如果文件有一百万行,并且平台是 Windows 或其他换行符更多的东西超过一个字符,则将分配 1M 额外字节。但如果每行平均为 50 字节长,您将分配 50MB,因此这是 2% 的开销)。
唯一的替代方法ftell
是读取文件中的每一行,并计算字符数。而且,如果您想将文件读入内存,那是一种非常糟糕的方法。
stat
or或其他类似函数的建议fstat
将具有完全相同的缺陷,即给出“文件在磁盘上占用的字节数,而不是您读取的字符数”[再次假设换行符不止一个字符,在 Windows 和其他一些操作系统上就是这种情况]。
如果您在行尾字符超过一个字节长的平台(如 Windows)上以非二进制模式读取文件,则实际上无法准确判断文件将在内存中占用多少空间。
尽管如此,除非文件有很多非常短的行,否则返回的文件大小ftell
或fstat
只会有点太大。