与readline()
功能类似。我想实现这个,
首先我必须阅读read(fd, buf, 4096);
等文件,然后,我必须逐字节地比较buf[i]
,如if (buf[i] == '\n')
。
因此,如果我找到相应的i
,则使用lseek()
转到第一个文件偏移量,然后再使用read(fd, buf, i)
。在这样的fisrt操作之后,第二次readline()
调用将再次执行此机制。
我最初认为这个解决方案,但比较buf[i]
,这意味着逐字节比较,太慢,无法读取fd
中的所有字符。我必须要像这样比较还是有更好的解决方案?
答案 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()}
如果您需要经过良好测试的解决方案,您应该阅读现有实施的来源,......