【问题标题】:C++ Fastest way to parse through a fileC++ 解析文件的最快方法
【发布时间】:2012-12-13 20:38:46
【问题描述】:

我有一个打开的文件:

ifstream ifile(FilePath)

该文件包含 10 行数据,每行包含均匀递增的逗号分隔值(如金字塔)。所以第一行有 1 个值,第二行有 2 个值,依此类推......

我想在一个函数中执行以下操作(同时遍历文件 char 数组一次):

-每次遇到换行符时,我可以递增一个按值传入的参数(当函数退出时,我有文件中的行数)。

-我还想将文件的每一行存储在一个数组中。将换行符之间的所有字符“粘合”在一起的最佳方法是什么?

我更喜欢使用静态分配的数组,但问题是我只有在执行第 1 步后才知道数组的大小(计算有多少换行符)。对此执行双重解析(一次解析计算多少行,然后使用该值分配静态数组)或单解析,但插入到动态数组中会更快吗?

强调这一点是为了编写快速代码(所以不是面向对象友好的问题)

抱歉,如果我问了很多问题,希望你能看到我已经考虑过了。

编辑,示例文件:

一个

b,c

d,e,f,g,h

j,k,l,m,n,o,p

从这个文件我想实现:

  • 知道文件有4行
  • 包含每一行的非动态数组
  • 第二行的元素个数

【问题讨论】:

  • 你看过Boost.Spirit.Qi吗?有一个学习曲线,如果你不使用预编译的头文件,编译时间并不令人满意,但如果你尽量减少回溯,运行时性能会很好。
  • 代码在我的另一台电脑上,但我最初使用的是 while(getline(File, line)){vector.push_back(line);} 但这只是逐行放入向量。我现在在想,如果我逐个传递字符,我可以减少解析/分割行数
  • @ildjarn 你能详细说明预编译的头文件吗?我认为对于 boost 库,有些是预编译的,有些不是 - 你没有选择?
  • 不知道为什么有人会使用 boost::spirit 来解决这样一个简单的问题。它就像 5 行 C++ 代码。
  • @LokiAstari :Spirit 比问题的内容更能解决问题的标题。 user997112,我怀疑它会很重要,但是您可以使用内存映射文件而不是标准流将数据加载到内存中。

标签: c++ string boost char


【解决方案1】:

现有帖子中有很多关于如何做到这一点的示例。

如果你想使用 ifstream 读取文件一次,你可以这样做:

std::ifstream in("myfile");

std::stringstream buffer;
buffer << in.rdbuf();

std::string contents(buffer.str());

【讨论】:

  • 所以 ifstream 不是将文件读入内存的最佳方式?
  • 添加了如何使用 ifstream 读取(数据块)在缓冲区中获取文件并存储为字符串
  • 这真的只有在文件很大时才能得到任何东西,因为磁盘访问已经被缓冲了。如果它很大,那么你还有其他问题。但是 sscanf() 可能很快但不安全。最好使用更慢但更安全的运算符 >> 它可能会更慢,但对于这个问题来说已经足够快了。
  • 他要求最快的代码,不涉及安全性。我的我的我们很关键,否决票?真的吗?
  • 大家好,我刚刚比较了 boost::interprocess 文件映射和 ifstream,boost 的实现速度是原来的两倍
猜你喜欢
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2015-01-23
相关资源
最近更新 更多