-1

以下代码显示了如何使用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是 a char*,我将如何将结果分成几行?或者有没有更好的方法来使用从文本文件中读取行mmap

4

1 回答 1

2

不清楚为什么要首先映射文件。我想这是为了性能,但除非您通过性能测试确定您的程序运行速度不够快,并且有问题的文件上的 I/O 是它的一个重要瓶颈,否则这样的步骤将是抢先一步。

不过,如果您决定对文件进行 mmap 映射,并且还必须对其执行某种形式的逐行处理,那么识别换行符的替代方法是:

  1. 检查字节以查看哪些是行终止符。

细节取决于你想要做什么。如果您可以在扫描数据时测试换行符,则可以提高效率,但如果有必要,您可以提前扫描当前处理位置以找到下一行终止符,以便提前知道它在哪里。memchr()你可以把它写成一个简单的循环,或者你会发现使用这个函数很方便。

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

于 2016-02-12T22:47:25.673 回答