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