读取文件后提取子 vector 时出现 C++ 错误

标签 c++ file vector

我正在读取一个文件并从中创建 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);

当此代码读取文件的最后一行时,将读取文件中的最后一个字符,即最后一个换行符。代码从此处继续,但文件没有设置了eofeof 位仅在由于文件结尾而尝试从文件读取失败后才设置。

这还没有发生。 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/

相关文章:

c++ - 编译错误: "pointer can only be subtracted from another pointer"

file - 目录和没有扩展名的文件有什么区别?

重新缩放向量 R

c++ - 如何初始化 std::map 项的 std::vector?

c++ - QT 5.3 配置命令的位置

c++ - 为什么 std::any_cast 不支持隐式转换?

c++ - Qt on beagle bone black(完全安装而不是交叉编译)

java - 如何从我的 java 项目生成 exe 文件?我应该使用哪个工具?

c++ - 输出到文件给出错误的指针值

c++ - 使用自定义分配器修改增长策略