使用mmap在C中逐行读取文件的最佳方法?

时间:2016-02-12 22:26:57

标签: c mmap line-by-line

以下代码显示了如何使用mmap命令读取文件的一部分:

       addr = mmap(NULL, length + offset - pa_offset, PROT_READ,
                   MAP_PRIVATE, fd, pa_offset);
       if (addr == MAP_FAILED)
           handle_error("mmap");

       s = write(STDOUT_FILENO, addr + offset - pa_offset, length);
       if (s != length) {
           if (s == -1)
               handle_error("write");

如果addrchar*,我如何将结果拆分成行?或者是否有更好的方法使用mmap从文本文件中读取行?

1 个答案:

答案 0 :(得分:2)

目前还不清楚为什么要首先对文件进行mmap。我想这是为了性能,但除非你已经通过性能测试确定你的程序运行速度不够快,并且有问题的文件上的I / O是它的一个重要瓶颈,那么这样一个一步就是跳枪。

尽管如此,如果您决定对该文件进行mmap,并且还必须对其执行某种形式的逐行处理,那么您可以选择识别换行符:

  1. 检查字节以查看哪些是行终止符。
  2. 详细信息取决于您想要做什么。如果您可以在扫描数据时测试换行,则效率会更高,但如果需要,您可以在当前处理位置之前扫描以找到下一个行终止符,以便提前知道它的位置。您可以将其编写为简单的循环,或者您可能会发现使用memchr()函数很方便。

    请记住,您可能不想修改数据(如果您使用PROT_READ进行映射,则不能这样做),所以您不能指望除非将数据复制到单独的缓冲区,否则用字符串终止符替换行终止符。此外,最后一行可能有也可能没有终止符。因此,您需要谨慎使用标准字符串函数。

相关问题