逐行实现读取文件,如readline()

时间:2016-07-18 12:38:53

标签: c unix file-read

readline()功能类似。我想实现这个,

首先我必须阅读read(fd, buf, 4096);等文件,然后,我必须逐字节地比较buf[i],如if (buf[i] == '\n')

因此,如果我找到相应的i,则使用lseek()转到第一个文件偏移量,然后再使用read(fd, buf, i)。在这样的fisrt操作之后,第二次readline()调用将再次执行此机制。

我最初认为这个解决方案,但比较buf[i],这意味着逐字节比较,太慢,无法读取fd中的所有字符。我必须要像这样比较还是有更好的解决方案?

2 个答案:

答案 0 :(得分:3)

我认为您不能使用fgets()的原因是,这是一个练习,您应该学习一些关于POSIX低级I / O功能的内容,也许还有一些关于缓冲的内容。 。如果您真的只关心获取数据,那么我建议您通过fdopen()在文件描述符周围打包一个流,然后使用fgets()来读取它。

  

我最初认为这个解决方案,但比较buf [i],这意味着逐字节比较,太慢,无法读取fd中的所有字符。我必须要像这样比较还是有更好的解决方案?

您想要读取给定字节的第一个外观。您如何在不检查您阅读的每个字节的情况下做到这一点?除非有硬件支持,否则它是不可能的,你不太可能拥有它。

无论如何,我认为你的担忧是错误的。将数据从磁盘移动到内存要比检查内存中的数据要昂贵得多。如果您打算以低级别工作,并且希望获得良好的性能,那么您必须以适当的大块读取磁盘中的数据,就像您在基于read()的方法中所做的那样。

另一方面,您希望避免重新读取任何数据,因此如果您在良好的表现之后,那么lseek()就不合适了。此外,如果您需要处理不可搜索的文件,例如管道,那么lseek()完全不可能。在任何一种情况下,您都必须以某种方式维护缓冲区,并准备从其内容中提供多个请求。此外,您必须为行边界与缓冲区边界不对应的可能性做好准备,有时您可能需要多次读取才能找到换行符,并且可以想象行将比缓冲区更长,无论多长那是。

因此,如果fgets()和其他基于流的I / O替代方案不适合您,则需要解决缓冲区管理问题。我建议你从那里开始。一旦你得到了解决方案,就缓冲方面编写fgets()的模拟应该是直截了当的。

答案 1 :(得分:-2)

使用' read'实现fgetc对于1个字符,使用您自己的getc来实现readline?

${jsonNode.strip()}

如果您需要经过良好测试的解决方案,您应该阅读现有实施的来源,......