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

Posted

技术标签:

【中文标题】使用 mmap 在 C 中逐行读取文件的最佳方法? [关闭]【英文标题】:Best way to read a file line-by-line in C using mmap? [closed] 【发布时间】:2016-02-12 22:26:56 【问题描述】:

以下代码显示了如何使用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】:

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

尽管如此,如果您确定要对文件进行 mmap,并且还必须对其执行某种形式的逐行处理,那么您识别换行符的替代方法是:

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

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

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

【讨论】:

以上是关于使用 mmap 在 C 中逐行读取文件的最佳方法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Go 中逐行读取文件

如何在Shell脚本中逐行读取文件

Objective C - 创建文本文件以在 Cocoa 中逐行读取和写入

在 C# 中逐行读取文件

如何在目标c中逐行解析JSON文件

在nodejs中逐行读取文件没有简单的方法吗? [复制]