【发布时间】: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,我怀疑它会很重要,但是您可以使用内存映射文件而不是标准流将数据加载到内存中。