c - 使用 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() 从文件中读取整数,而不是解析每个字节以确定字符串的结尾,然后转换为整数?
解决方案
有没有更好的方法使用 pread() 从文件中读取整数,而不是解析每个字节以确定字符串的结尾,然后转换为整数?
是的,将大块数据读入内存,然后对内存进行解析。使用大缓冲区(即取决于系统内存)。在可用千兆字节内存的现代系统上,您可以使用兆字节范围内的缓冲区。我可能会从 1 或 2 兆字节的缓冲区开始,看看它是如何执行的。
这将比逐字节读取更有效率。
注意:您的代码需要处理文件中的块在整数中间停止的情况。这给代码增加了一点复杂性,但处理起来并不难。
我可以读取任何长度的整数
好吧,如果您实际上是指大于系统最大整数的整数,那么它要复杂得多。strtol
不能使用标准功能。此外,您需要定义自己的存储这些值的方式。或者,您可以获取可以处理此类值的公共库。
推荐阅读
- laravel-5 - 从一对一的关系中得到结果
- c# - Linq 查询不会返回与 SQL 查询相同的数据
- apache - 将 http 重定向到 https 仅在页面刷新 Apache2 后才有效
- intellij-idea - Kotlin - 提取变量快捷方式后在 IntelliJ 中显式指定类型
- haskell - 用于计算第三根的 Haskell 程序
- sql - 从另一个表和静态值更新 SQL 行
- c - 在 C 中使用管道:两个子进程
- python - 使用切片列表从 DataFrame 中获取行
- php - 需要帮助解析 JSON 输出
- python - 是否可以使用 Python 检查是否已在 Windows 上打开文件夹?