【问题标题】:Reading a file using pread使用 pred 读取文件
【发布时间】:2021-07-28 10:21:59
【问题描述】:

问题的目的是仅使用 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() 从文件中读取整数,而不是解析每个字节以确定字符串的结尾,然后转换为整数?

【问题讨论】:

  • 字节不是数字(或者是 0 到 255 之间的数字)。它可以编码一个digit。 2021年UTF-8 is used everywhere。 StackOverflow 不是一个做我的家庭作业的网站。另见this C reference。最后,为了效率,你需要做一些缓冲 IO。请在您的问题中提供一些minimal reproducible example
  • 你实际上并没有问过问题。
  • 谢谢,我已经更新了描述以包含明确的问题。
  • @BasileStarynkevitch 我不是要求做作业。我只是想看看对于这种情况是否有更好的解决方案或方法。根据我的 cmets,我很清楚我有一个可行的解决方案,但我想改进并寻求集体智慧。
  • 这一步:“如果是,增加偏移量并再次读取 val”对我来说听起来很奇怪......你怎么能从另一个偏移量再次读取值?为什么要两次读取相同的值?您已经拥有内存中的值。

标签: c algorithm


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 不,数 GB 的巨大缓冲区无济于事。根据经验,2021 年兆字节大小的缓冲区会更好。如果性能对 µs 很重要,请考虑使用 readahead(2) 和/或 posix_fadvise(2)
  • @BasileStarynkevitch 好吧,好吧,也许我的措辞不好。其实我已经更新了答案。
猜你喜欢
  • 2016-01-23
  • 2018-10-18
  • 2015-01-19
  • 2010-12-09
  • 2015-02-22
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多