4 c
计算文件中行号的最简单方法是:
while(!feof(fp))
{
ch = fgetc(fp);
if(ch == '\n')
{
lines++;
}
}
Run Code Online (Sandbox Code Playgroud)
但现在要求是我必须计算大文件中的行数.它会对性能产生影响.
有更好的方法吗?
对于最快的I/O,通常需要读取/写入文件系统/ OS 的块大小的倍数.
您可以通过调用statfs或fstatfs在文件或文件描述符上查询块大小(阅读手册页).
该struct statfs有一个场f_bsize,有时也f_iosize:
最佳传输块大小
该f_bsize字段存在于所有POSIX系统AFAIK上.在Mac OS X和iOS上,还有f_iosize一个是您在这些平台上喜欢的(但也f_bsize可以在Mac OS X/iOS上运行,通常应该与f_iosizeIIRC 相同).
struct statfs fsInfo = {0};
int fd = fileno(fp); // Get file descriptor from FILE*.
long optimalSize;
if (fstatfs(fd, &fsInfo) == -1) {
// Querying failed! Fall back to a sane value, for example 8kB or 4MB.
optimalSize = 4 * 1024 * 1024;
} else {
optimalSize = fsInfo.f_bsize;
}
Run Code Online (Sandbox Code Playgroud)
现在分配该大小的缓冲区并读取(使用read或fread)该大小的块.然后迭代这个内存中的块并计算换行数.重复直到EOF.
另一种方法是@Ioan提出的方法:用于mmap将文件映射到内存并迭代该缓冲区.这可能会为您提供最佳性能,因为内核可以以最有效的方式读取数据,但是对于"太大"的文件,这可能会失败,而我上面描述的方法总是适用于任意大小的文件并且让您靠近 - 最佳性能.