我知道这个话题已经讨论了很多,但我仍然没有真正理解。不可否认,我对C ++编码很陌生,所以请放轻松我:)
无论如何:我有这个examplatory csv文件:
,313,315
91.5919,1.44421,1.74019
91.592,1.44254,1.73816
91.5921,1.43859,1.73336
91.5922,1.43449,1.73109
我需要一个先验未知维度的数组,因为csv将无法预测地扩展 - > x和y方向的动态数组。
这是我到目前为止所做的事情:
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<vector<double> > values;
vector<double> valueline;
ifstream fin("in.csv");
string item;
for (string line; getline(fin, line); )
{
istringstream in(line);
while (getline(in, item, ','))
{
valueline.push_back(atof(item.c_str()));
}
values.push_back(valueline);
valueline.clear();
}
}
它似乎正在完成这项工作,但如果我尝试输出数组或部分数据,我会得到奇怪的结果。例如cout&lt;&lt;值[0] [3]&lt;&lt; ENDL;收益率为1.63042e-322。值[0] [4]得到91.5919。 sizeof(values [0])也是24。
我做的事情我不应该在这里吗?
任何帮助都会很棒!感谢
答案 0 :(得分:2)
尝试使用.at()
运算符来查看您是否在向量的末尾读取? values[0][3]
是第一行的第四个元素,在您的输入中不存在?
您可能想要这样做:
std::cout << values[3][0]; // Fourth line, first element;
或
std::cout << values.at(3).at(0); // Fourth line, first element;
向量上的索引运算符不进行边界检查。这是出于性能原因。你正在阅读界限,因此你得到了奇怪的数字。 at() throws a std::out_of_range exception.
答案 1 :(得分:1)
在向量上使用sizeof
几乎没用 - 它告诉你顶级向量数据结构的大小(通常是两个size_t
和一个指针),以字节为单位,这不是很糟糕有用。如果您想要矢量的大小,请使用size
方法 - values[0].size()
告诉您第一行有多少值。