【问题标题】:How to correctly buffer lines using fread如何使用 fread 正确缓冲行
【发布时间】:2017-08-07 11:45:01
【问题描述】:

出于某种原因(速度和...),我想将fread() 用于 IO。我有一个不同大小的行的文件。通过使用如下代码:

while( !EOF ){ 
  fread(buffer,500MB,1,fileName);
  // process buffer
}

最后一行可能读不全,下次试一试还要再读最后一行,如何强制fread()从最后一行开始继续?

或者如果可能的话,如何强制fread() 读取超过 500MB 直到到达 \n 或其他特定字符?

谢谢大家

阿米尔。

【问题讨论】:

  • 如果你想要线条,为什么不使用fgets()fseek() 和它有什么关系?或seekg()?
  • 您可能只需要分块阅读。 stackoverflow.com/questions/34081158/…
  • @EJP 因为我想将文件的一大块读入内存然后解析它。对于大文件,它比使用 fgets() 逐行读取要快。因为更少的 IO 访问......现在我需要一个函数来告诉 fread 更改下一次检索的位置
  • @doctorlove 您提供的链接手动完成,它会在缓冲区中找到最后一个 \n 并将剩余的复制到下一个缓冲区的开头,这对我来说不合适,我需要一种方法来告诉fread 改变读取位置,例如通过查找最后一个 \n 我们可以计算我们必须再次读取多少字节,告诉 fread() 向后读取一些字节并读取...
  • 对于大文件,它比使用 fgets() 逐行读取要快。因为更少的 IO 访问 不,它不会。如果要使用FILE * 类型的函数,则缓冲fread()/fgets() 和其他使用FILE * 的函数。查看setbuf()setvbuf() 然后使用fgets()getline() 读取行。

标签: c++ io fread fseek seekg


【解决方案1】:

假设你已经反向找到一个buffer的字节在pos位置找到一个\n字符,那么你想回滚到缓冲区的长度减去这个pos。打电话给step

您可以使用fseek 将文件指针向后移动这么多:

int fseek( FILE *stream, long offset, int origin );

你的情况

int ret = fseek(stream, -step, SEEK_END);

这将涉及重新读取文件的一部分,并进行相当多的跳转 - cmets 提出了可能更快的替代方法。

【讨论】:

  • 这样我们只会重新读取一些字节,而读取一些兆字节是可以原谅的,很好,感谢您的回答
猜你喜欢
  • 2012-01-31
  • 2021-10-24
  • 1970-01-01
  • 2019-03-12
  • 2023-03-11
  • 2013-01-17
  • 1970-01-01
  • 2018-05-07
  • 1970-01-01
相关资源
最近更新 更多