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

使用mmap在C中逐行读取文件的最佳方法?,c,mmap,line-by-line,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 -

以下代码显示了如何使用
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");

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

不清楚您首先为什么要mmap文件。我认为这是为了性能,但除非您通过性能测试确定您的程序运行速度不够快,并且所讨论的文件上的I/O对它来说是一个重大瓶颈,否则这样的步骤将是越狱

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

  • 检查字节以查看哪些字节是行终止符
  • 细节取决于你想做什么。如果可以在扫描数据时测试换行符,则效率会更高,但如果必要,则可以在当前处理位置之前进行扫描,以找到下一行终止符,从而提前知道它在哪里。您可以将其编写为一个简单的循环,也可以使用
    memchr()
    函数

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