我无法“撤消”这种方法,它基本上将一个可变大小的数字矩阵转储到文本文件中:
void vectorToFile(char *name, vector<vector<double>>* a){
FILE* fp = fopen(name, "w");
for(int i=0;i<a->size();i++){
for(int j=0;j<a->at(i).size();j++){
fprintf(fp, "%f ", a->at(i).at(j));
}
fprintf(fp, "\n");
}
fclose(fp);
}
我在实施反向时遇到了麻烦:
vector<vector<double>> fileToVector(char *name){ ??? }
我保证文件中的数字形成一个“矩形”,即内部向量的大小都相等,但我不知道如何计算每行的条目数和列数
有人能指出我正确的方向吗?到目前为止,我发现的每个例子都使用硬编码的大小或第一行中给出的大小(不幸的是我无法负担)实现更容易的东西
答案 0 :(得分:10)
我是C ++的新手,所以我不确定这是不是一个好方法,但我会打开文件,逐行读入输入,在读取时解析每一行。这是一些示例代码(未经测试,未编译):
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
std::vector<std::vector<double> > fileToVector(const char *name)
{
std::vector<std::vector<double> > result;
std::ifstream input (name);
std::string lineData;
while(getline(input, lineData))
{
double d;
std::vector<double> row;
std::stringstream lineStream(lineData);
while (lineStream >> d)
row.push_back(d);
result.push_back(row);
}
return result;
}
答案 1 :(得分:2)
您可以尝试更多C ++方法:
void vectorToFile(std::vector<double> const& vec, std::string const& filename) {
std::ofstream file(filename);
if(file.good()) {
file.flags(std::ios::fixed);
std::copy(vec.begin(), vec.end(), std::ostream_iterator<double>(file));
} else {
// throw error or sth
}
file.close();
}
如果您想保存为二进制文件,可以像这样使用ostream_binary_iterator - http://bit.ly/9JAxdp:
void vectorToFile(std::vector<double> const& vec, std::string const& filename) {
std::ofstream file(filename, std::ios::binary);
if(file.good()) {
file.flags(std::ios::fixed);
std::copy(vec.begin(), vec.end(), ostream_binary_iterator<double>(file));
} else {
// throw error or sth
}
file.close();
}
答案 2 :(得分:1)
如果使用C ++ I / O而不是C I / O会更容易。我建议使用ifstream
来读取文件并使用getline()
来读取每一行。然后每一行都应该是vector
中的数字。解析string
的最简单方法可能是使用stringstream
。然后,您可以将每个double
和push_back()
解析为vector
,这样您就不必关心vectors
的大小了。我还建议您尽可能使用std::string
而不是char*
(尽管对于文件名,您通常最终必须在它们上使用c_str()
,因为文件I / O的东西似乎总是采用const char*
代替std::string
)。
答案 3 :(得分:0)
您可以使用您拥有的分隔符读取行,然后解析为数字。
您可以使用getline
将行读取为字符串,您无需知道确切的数字。
答案 4 :(得分:-2)
使用载体是否有任何特殊原因&gt;而不是只使用double **并使用new double []来分配数组和每个子元素?我的猜测是数组可以在运行时动态调整大小,但是如果数组只分配一次,那么使用double **必然比迭代向量更有效。
在任何情况下,您的问题的解决方案是将数组的边界预先转储到文件中并将其读回...