[英]Getting segmentation fault (core dumped) error when declaring a int variable
[英]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.