首页 > 解决方案 > 使用 pred 读取文件

问题描述

该问题的目的是仅使用 pread 来读取带有整数的文件。

我正在尝试设计一个通用解决方案,我可以在其中读取任何长度的整数,但我认为我当前的算法必须有更好的解决方案。

为了解释和指导算法,这里是一个示例输入文件。我已明确添加\r\n以表明它们存在于文件中。

输入文件:

23456\r\n
134\r\n
1\r\n
345678\r\n

算法

1. Read a byte from the file 
2. Check if it is number i.e '0' <= byte <= '9'
3.1 if yes, increment the offset and read the next byte
3.2 if not, is it \r 
3.2.1 if yes, read the next and it should be \n. 
Here the line is finished and we can use strtol to convert string to int.
3.2.2 // Error condition

我需要制作这个算法,因为如果发现 pread 将文件作为字符串读取,并且只是将请求的字节数推送到提供的缓冲区中。

问题:有没有更好的方法使用 pread() 从文件中读取整数,而不是解析每个字节以确定字符串的结尾,然后转换为整数?

标签: calgorithm

解决方案


有没有更好的方法使用 pread() 从文件中读取整数,而不是解析每个字节以确定字符串的结尾,然后转换为整数?

是的,将大块数据读入内存,然后对内存进行解析。使用大缓冲区(即取决于系统内存)。在可用千兆字节内存的现代系统上,您可以使用兆字节范围内的缓冲区。我可能会从 1 或 2 兆字节的缓冲区开始,看看它是如何执行的。

这将比逐字节读取更有效率。

注意:您的代码需要处理文件中的块在整数中间停止的情况。这给代码增加了一点复杂性,但处理起来并不难。

我可以读取任何长度的整数

好吧,如果您实际上是指大于系统最大整数的整数,那么它要复杂得多。strtol不能使用标准功能。此外,您需要定义自己的存储这些值的方式。或者,您可以获取可以处理此类值的公共库。


推荐阅读