试图读取包含int的文件并存储在int向量中,但我不断收到“Segmentation fault(core dumped)”错误

时间:2017-03-26 01:05:53

标签: c++ segmentation-fault

所以我为我的项目制作了这个练习文件,尝试读取包含整数的文件,并将它们存储在一个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;
}

3 个答案:

答案 0 :(得分:1)

c ++ std :: vectors需要在添加之前调整大小。试试&#34; push_back&#34;相反,它将它们添加到最后并调整矢量大小以适应。

BTW不同于您无法使用的#34; vector [i] == value&#34;自动调整c / c ++数组/向量的大小。

顺便说一下,c数组和std :: vector中的方括号[]运算符与JavaScript完全不同。 JavaScript数组是关联映射,使用array [value]会导致它创建一个键&#34;值&#34;自动。但这非常缓慢。 c / c ++中的方括号运算符不是那样的。它们是一种更快的直接内存访问系统。

如果你有一个名为&#34; myArray&#34;的数组。并且你要求myArray [10],计算机只是查看计算机RAM 10地址内的任何内容超出myArray的开头(乘以元素的大小,所以myArray [10]将超过一个40字节开始具有4字节值的数组,例如int或float。

它专为纯粹的速度而设计,所以没有添加边界检查。它完全取决于c / c ++程序员,以确保您不会使用方括号operatork读取或写入边界,但收益是更快的程序。您可以将自己的边界检查添加到您自己的代码中,或者您可以注意不要超过您已分配的范围。

答案 1 :(得分:1)

你想要这样做

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

在您的代码中,您定义inputVec而不给它初始容量,因此您可以假设它的大小为0.因此当您编写inputVec[i]时,您实际上是在尝试访问索引超出向量的边界。这就像访问大小为4的数组中的第5个元素。

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

答案 2 :(得分:0)

使用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