【发布时间】:2014-08-20 21:58:35
【问题描述】:
我有一个相当大的二维字符串向量,我想写入 CSV 文件,但我的代码在写入时崩溃。有什么建议吗?
if (outfile.is_open()) {
for (int i = 0; i < width.size() - 1; i++) {
for (int j = 0; j < rows.size() - 1; j++) {
outfile << cells[i][j] << ",";
}
outfile << endl;
}
} else cout << "Unable to write.";
宽度、行和单元格的声明:
//Declare stuff
vector<string> rows, cols, width;
vector< vector<string> > cells;
string line;
//Open input file
std::ifstream infile("99-110.csv", ios_base::in);
std::ofstream outfile("99-110_corr.csv", ios_base::out);
//Create vector with each row as an index
while (getline(infile, line)) {
rows.push_back(line);
width = split(rows[0], ",");
}
//Split each vector index into a 2D vector
for (int i = 0; i < rows.size(); i++) {
cols = split(rows[i], ",");
cells.push_back(cols);
}
事实证明,我将 rows.size() 和 width.size() 混淆了。我交换了它们,现在一切似乎都适用于小文件,但对于大于约 500 MB 的文件,我的脚本在抛出“std::bad_alloc”实例后调用 terminate 崩溃。它似乎在 for 循环期间崩溃,我将每个向量索引拆分为 2D 向量(上面提供的最后一个 for 循环)。向量“单元格”的最大大小为 357,913,941,但我计算出向量的实际大小为 97,780,085。
【问题讨论】:
-
Any suggestions?使用调试器。 -
而
cells真的是width.size() * rows.size()矩阵吗?并且索引按显示的代码中的顺序排列?你能告诉我们width、rows和cells的声明和初始化吗? -
@JoachimPileborg 按要求进行了编辑。上面引用的 split 函数只是解析一个 csv 文件并用逗号分隔每一行。所以是的,我确定单元格是列 width.size() 和 rows.size()。
-
uhmmm,错了,每次放东西都在改变宽度。你不能确定它是否和
cells[i].size()一样大小。 -
对,但我知道行数和列数将始终与初始读取相同。这是一个方阵。