C++ 解析文件的最快方法

Posted

技术标签:

【中文标题】C++ 解析文件的最快方法【英文标题】:C++ Fastest way to parse through a file 【发布时间】: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,我怀疑它会很重要,但是您可以使用内存映射文件而不是标准流将数据加载到内存中。 【参考方案1】:

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

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

std::ifstream in("myfile");

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

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

【讨论】:

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

以上是关于C++ 解析文件的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中解析 XML 文件的最快方法?

Xpath vs DOM vs BeautifulSoup vs lxml vs other 哪个是解析网页的最快方法?

超大CSV文件如何最快速度解析

解析字典的最快pythonic方法,其中值是字节字符串化的json对象

Actionscript 3 - 将 yyyy-mm-dd hh:mm:ss 解析为 Date 对象的最快方法?

在 C++ 中从文件末尾读取的最有效方法是啥? (解析文件中的最后 128 位)