试图读取包含整数的文件并存储在整数向量中,但我不断收到“分段错误(核心转储)”错误

Posted

技术标签:

【中文标题】试图读取包含整数的文件并存储在整数向量中,但我不断收到“分段错误(核心转储)”错误【英文标题】:Trying to read file which contains ints and store in int vector, but I keep getting "Segmentation fault (core dumped)" error 【发布时间】:2017-03-26 01:05:53 【问题描述】:

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

【问题讨论】:

帮助阅读:Why is iostream::eof inside a loop condition considered wrong? 【参考方案1】:

你会想要这样做

while (inFile >> i)

    inputVec.push_back(i);

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

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

【讨论】:

【参考方案2】:

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

顺便说一句,不像例如javascript 不能使用“vector[i] == value”来自动调整 c/c++ 数组/向量的大小。

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

如果您有一个名为“myArray”的数组,并且您要求输入 myArray[10],则计算机只会查看计算机 RAM 10 中 myArray 开头之外的地址(乘以元素的大小,因此 myArray [10] 将比具有 4 字节值(例如 int 或 float)的数组的开头多 40 个字节。

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

【讨论】:

这里有一些假设。 “但这太慢了” 可能不会。一般来说你是对的,不过 +1 如果 std::vectors 对每个调用都进行边界检查并自动调整大小,那会很慢。请记住,需要对每个调用进行检查,而不仅仅是超出范围的调用。 是的,你基本上明白了。一般来说,我试图让人们远离谈论 C++ 的低级函数根本,因为它是故意从所有这些中抽象出来的。但在这种情况下,最终结果是相同的。 :)【参考方案3】:

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

【讨论】:

以上是关于试图读取包含整数的文件并存储在整数向量中,但我不断收到“分段错误(核心转储)”错误的主要内容,如果未能解决你的问题,请参考以下文章

堆栈内存/堆栈

堆栈内存 /STACK

如何使用 cin 将整数从控制台读取到向量中

将向量存储在内存映射文件中

如何转换从文本文件中读取的整数并存储为具有16位整数的二进制文件?

如何在 C++ 中使用输入重定向添加整数