【发布时间】:2019-12-17 04:46:04
【问题描述】:
我目前正在学习 C++ 语言,需要读取一个包含 5000 多个双精度型数字的文件。由于push_back 会在分配新数据时进行复制,因此我试图找出一种减少计算工作的方法。请注意,该文件可能包含随机数量的双精度类型,因此通过指定足够大的向量来分配内存并不是要寻找的解决方案。
我的想法是快速读取整个文件并获取数组的近似大小。在Save & read double vector from file C++?发现了一个有趣的想法,可以在下面的代码中找到。
基本上,包含文件数据的向量被插入到名为PathStruct 的结构类型中。请记住,PathStruct 包含比这个向量更多的内容,但为了简单起见,我删除了所有其余部分。该函数接收PathStruct指针的引用并读取文件。
struct PathStruct
{
std::vector<double> trivial_vector;
};
bool getFileContent(PathStruct *&path)
{
std::ifstream filename("simplePath.txt", std::ios::in | std::ifstream::binary);
if (!filename.good())
return false;
std::vector<char> buffer{};
std::istreambuf_iterator<char> iter(filename);
std::istreambuf_iterator<char> end{};
std::copy(iter, end, std::back_inserter(buffer));
path->trivial_vector.reserve(buffer.size() / sizeof(double));
memcpy(&path->trivial_vector[0], &buffer[0], buffer.size());
return true;
};
int main(int argc, char **argv)
{
PathStruct *path = new PathStruct;
const int result = getFileContent(path);
return 0;
}
当我运行代码时,编译器给出以下错误:
损坏的大小与 prev_size,中止(核心转储)。
我认为我的问题在于不正确使用指针。绝对不是我的强项,但我找不到问题。我希望有人能帮助这个可怜的灵魂。
【问题讨论】:
-
您知道文件将包含的最低数据量吗?
-
分配两个向量没有意义(只是看你的代码),这似乎只是浪费资源。此外,我认为一个关键点是你的双打是如何在文件中编码的。二进制形式? ASCII/文本表示(具有固定长度?)等
-
5000
double占用高达 40kB 的内存,我只保留一个合理的最大大小并使用push_back,保持简单。如果你发现速度很慢,那就是开始优化的时候了。 -
你的代码的问题是调用
reserve而不是resize,这意味着向量仍然是空的,所以你不能写入它 -
“.txt”后缀通常与文本一起使用。
标签: c++ memory vector dynamic memcpy