分段错误:11(C ++文件输入和输出,类和动态数组)

时间:2016-03-10 04:53:25

标签: c++ string file-io dynamic-arrays

我正在研究一个应该读取文件的程序,将其内容作为输入并将其写入动态数组。每当我执行程序输出(打印输出)应该作为输入的单词时,我得到一个“分段错误:11”。该程序的概念是读取包含英语单词的文件及其在西班牙语和打印输出中的翻译。原始代码较大但我只包含文件I / O和动态数组,它们是触发段错误的数组。任何有关为什么会发生这种情况的帮助以及可行的解决方案都会受到赞赏。

我的代码:

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
#include <algorithm>
#include <cctype>

using namespace std;

class diccionario {
public:
    void abrir_file (ifstream& entrada, ofstream& salida);
    diccionario();
    ~diccionario();
    void escribir(ofstream& salida);
    void validar();
private:
    string *espdic;
    string *engdic;
    int size;
};

diccionario::diccionario () : cantidad(0), size(10) {
    string *espdic = new string [size];
    string *engdic = new string [size];
}

diccionario::~diccionario () {

}

void abrir_file (ifstream& entrada, ofstream& salida) {
  entrada.open ("palabras.txt");
  if(entrada.fail())
    {
      cout << "Error abriendo archivo" << endl;
      salida << "Error abriendo archivo" << endl;
      exit(1);
    }

  salida.open ("salida.txt");
  if(salida.fail())
    {
      cout << "Error abriendo archivo" << endl;
      salida << "Error abriendo archivo" << endl;
      exit(1);
    }   
}

int main() {
    int opcion, size;
    ifstream entrada;
    ofstream salida;
    string temp;
    diccionario english;
    string *espdic = new string [size];
    string *engdic = new string [size];

    abrir_file (entrada, salida);

    if(entrada.is_open()) {
        while(entrada >> temp) {
            engdic[size] = temp;
            size++;
        }
    }

    do {
        menu(salida);
        cin >> opcion;
        switch (opcion) {

            case 1:
            english.escribir(salida);
            break;

            case 2:
            cout << "Fin de programa" << endl;
            salida << "Fin de programa" << endl;
            exit(1);
        }
    } while (opcion != 0);

    salida.close();
    entrada.close();

    return 0;
}

输入文件(palabras.txt):

God Dios
Violet Violeta
Ray Rayo
Master Maestro
Power Poder

1 个答案:

答案 0 :(得分:0)

我在这里看到的问题很少。

  1. size未提供。
  2. 主要功能。您声明了大小变量,但从未给它赋值。让我们说你需要分配25个元素。用作

    int size=25;
    
    1. 访问超出范围的内容。

      engdic [size] = temp;

    2. 假设,engdic的分配是25个元素,它的索引从0开始,以24结尾(engdic [0]到engdic [24]),但是,在上面的语句大小是未初始化的,它可能访问更多的24,造成分段错误。

      1. sizewhile循环之前未初始化为零。
      2. 在下面的代码中,大小的起始值和结束值是多少?理想情况下,您应该从0开始并以最大容量结束(此处为24)

          

        while(entrada&gt;&gt; temp){       engdic [size] = temp;       大小++; }