我正在读取一个文件并从中创建 vector ,之后我尝试提取一个子 vector ,如下所示:
vector<double> v = {1, 2, 3, 4, 5};
displayVector(v);
vector<double> v2(&v[1], &v[v.size()]);
displayVector(v2);
在这种情况下,代码有效,我只是从原始 vector 中删除第一个特征,我也可以这样做:
v.erase(v.begin());
这也给了我想要的输出,但对于我的应用程序来说,第一种方式很有趣。
这里的问题是我从文件中读取并构建 vector 。这样的文件看起来像这样:
1000025,5,1,1,1,2,1,3,1,1,2
1002945,5,4,4,5,7,10,3,2,1,2
1015425,3,1,1,1,2,2,3,1,1,2
1016277,6,8,8,1,3,4,3,7,1,2
1017023,4,1,1,3,2,1,3,1,1,2
1017122,8,10,10,8,7,10,9,7,1,4
1018099,1,1,1,1,2,10,3,1,1,2
1018561,2,1,2,1,2,1,3,1,1,2
1033078,2,1,1,1,2,1,1,1,5,2
1033078,4,2,1,1,2,1,2,1,1,2
1035283,1,1,1,1,1,1,3,1,1,2
1036172,2,1,1,1,2,1,2,1,1,2
1041801,5,3,3,3,2,3,4,4,1,4
1043999,1,1,1,1,2,3,3,1,1,2
1044572,8,7,5,10,7,9,5,5,4,4
1047630,7,4,6,4,6,1,4,3,1,4
1048672,4,1,1,1,2,1,2,1,1,2
1049815,4,1,1,1,2,1,3,1,1,2
1050670,10,7,7,6,4,10,4,1,2,4
1050718,6,1,1,1,2,1,3,1,1,2
1054590,7,3,2,10,5,10,5,4,4,4
1054593,10,5,5,3,6,7,7,10,1,4
1056784,3,1,1,1,2,1,2,1,1,2
我对第一个坐标不感兴趣的地方,这是我的代码:
void displayVector (std::vector<double> &v) {
for (auto &feature : v) {
std::cout << feature << " ";
}
std::cout << std::endl;
}
void displayTrainingSet(vector<FeaturedVector> &data) {
for (auto a : data) {
displayVector(a);
}
}
int main(int argc, char const *argv[]) {
ifstream file;
string filename = "breast-cancer.data";
file.open(filename, std::ifstream::in);
vector<FeaturedVector> data;
while (file.good()) {
string line;
getline(file, line);
istringstream buffer(line);
double feature;
vector<double> v;
while (buffer >> feature) {
if (buffer.peek() == ',') {
buffer.ignore();
}
v.push_back(feature);
}
vector<double> v1(&v[1], &v[v.size()]);
data.push_back(v1);
}
file.close();
//displayTrainingSet(data);
return 0;
}
上面的代码可以编译,但是当我尝试运行它时出现了奇怪的错误,这是由线 vector v1(&v[1], &v[v.size()]) 引起的:
libc++abi.dylib: terminating with uncaught exception of type std::length_error: vector
Abort trap: 6
有人知道为什么会这样吗?我知道从文件中读取并创建 vector v 是有效的,因为我已经尝试在屏幕上显示 vector 并且它工作正常。在此先感谢您的帮助!
最佳答案
getline(file, line);
当此代码读取文件的最后一行时,将读取文件中的最后一个字符,即最后一个换行符。代码从此处继续,但文件
没有设置了eof
。 eof
位仅在由于文件结尾而尝试从文件读取失败后才设置。
这还没有发生。 getline()
只读到文件中的最后一个字符,最后一个换行符,然后停止。
在循环的下一次迭代中:
while (file.good()) {
这会成功。正如我所解释的,eof
标志尚未设置。
string line;
getline(file, line);
这将无法从文件中读取任何内容,设置文件上的 eof
位。 line
将是一个空字符串。
因为 line
现在是空的,内部的 while
循环不会提取任何东西,并且
vector<double> v;
将保持为空 vector 。
vector<double> v1(&v[1], &v[v.size()]);
鉴于 v
现在是一个空 vector ,v.size()
将为 0,那么您认为现在这里会发生什么?
关于读取文件后提取子 vector 时出现 C++ 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40813777/