繁体   English   中英

尝试读取包含int的文件并将其存储在int向量中,但是我一直收到“分段错误(核心转储)”错误

[英]Trying to read file which contains ints and store in int vector, but I keep getting “Segmentation fault (core dumped)” error

因此,我为我的项目制作了此练习文件,以尝试读取包含整数的文件,并将其存储在int向量中。 我的问题是,每当我运行该程序时,在调用readFile()函数的过程中都会出现“分段错误(内核已转储)”的问题。

不要介意额外的导入,我只需将相同的导入复制并粘贴到我的所有练习文件中即可。 还有cout << "hi" << endl; 只是看程序何时有错误。

#include <string>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cassert>
#include <vector>
using namespace std;

vector<int> readFile(string fileName);

int main()
{
    vector <int> intvec = readFile("ints.txt");
    cout << "hi" << endl;
    for (int i = 0; i < intvec.size(); i++)
    {
        cout << intvec[i] << endl;
    }
    return 0;
}

vector<int> readFile(string fileName)
{
    ifstream inFile(fileName);
    vector<int> inputVec;
    int i = 0;
    while (!inFile.eof())
    {
        inFile >> inputVec[i];
        i++;
    }
    inFile.close();
    return inputVec;
}

在添加c ++ std :: vector之前,需要对其进行调整大小。 尝试使用“ push_back”函数,该函数将它们添加到最后并调整向量的大小以适合。

顺便说一句,与JavaScript不同,您不能使用“ vector [i] == value”自动调整ac / c ++数组/向量的大小。

顺便说一句,c数组和std :: vector中的方括号[]运算符与JavaScript中的完全不同。 JavaScript数组是关联映射 ,使用array [value]会使其自动创建键“ value”。 但这非常慢。 c / c ++中的方括号运算符不能那样工作。 它们是一个更快的直接内存访问系统。

如果您有一个名为“ myArray”的数组,并要求使用myArray [10],则计算机只会查看计算机内部RAM 10地址中超出myArray开头的任何内容(乘以元素的大小,因此myArray [10])将以4字节的值(例如int或float)在数组的开头之后40字节。

它是为纯速度而设计的,因此没有界限检查。 完全由c / c ++程序员负责,以确保您不会在方括号操作符的范围内进行读写操作,但这样做的好处是程序速度更快。 您可以将自己的边界检查添加到自己的代码中,或者只是要注意不要超出分配的范围。

你想这样做

while (inFile >> i)
{
    inputVec.push_back(i);
}

在代码中,您定义了inputVec而不赋予其初始容量,因此可以假定其大小为0。因此,当您编写inputVec[i] ,您实际上是在尝试访问向量边界之外的索引。 就像访问大小为4的数组中的第5个元素一样。

通过使用push_back ,您可以向向量添加元素,它将动态调整大小。

使用std::copy算法和迭代器,向量可以填充以下内容:

#include <fstream>
#include <iterator>
#include <algorithm>
#include <vector>

int main()
{
    std::vector<int> intvec;
    std::ifstream ifs("ints.txt");
    std::copy(std::istream_iterator<int>(ifs),
              std::istream_iterator<int>(),    
              std::back_inserter(intvec));
}

注意: std::back_inserter自动为流中的每个项目调用push_back

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM