尝试读取包含 ints 并存储在 int vector 中的文件,但我不断收到错误"Segmentation fault (core dumped)"

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

本文关键字:错误 Segmentation dumped core fault ints 包含 读取 存储 文件 vector      更新时间:2023-10-16

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

你会想要这样做

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

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

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

c++ std::vectors在添加到它们之前需要调整大小。尝试使用"push_back"函数,将它们添加到末尾并调整矢量大小以适合。

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

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

如果你有一个名为"myArray"的数组,并且你要求myArray[10],那么计算机只会查看计算机内存10地址之外的任何内容(乘以元素的大小,所以myArray[10]将比具有4字节值(如int或float)的数组开头多40个字节。

它是为纯粹的速度而设计的,因此没有添加任何边界检查。 这完全取决于 C/C++ 程序员,以确保您不会使用方括号运算符在边界之外读取或写入,但回报是程序要快得多。您可以将自己的边界检查添加到自己的代码中,也可以小心不要读取超出分配的范围。

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

相关文章: