g ++中的分段错误和从文件中读取

时间:2016-05-07 12:00:59

标签: c++ segmentation-fault g++ fstream

我对这个程序有问题,它从两个文件中读取。 每个文件A和B在顶部包含一个int,它是它所具有的字符串数。程序必须进行B-A操作,文件A有2个字符串," 2"和"三"。文件B有4个字符串,"一个","两个","三个"和"四"。所以第三个文件的结果必须是"一个"和"四"。那些不在文件A中,但在文件B中是。

首先我读取每个文件的大小,然后读取每个文件的字符串。  我计算结果文件的大小并比较两个文件的字符串。

我使用过gdb调试器,它说问题出在比较文件的问题上。我所做的是: 如果在A中找不到B中的字符串,我将其放在结果中。

我在这里写了整个程序(不是太大),所以你可以得到一个更好的主意。

非常感谢并抱歉变数中的西班牙名字。

#include <fstream>
#include <iostream>
#include <string>

using namespace std;


int main(){
int contador = 0;
string* datosA;
string* datosB;
string* resultado;
int tamA, tamB, tamResultado;

ifstream fichA("fA.txt");
if(fichA){
    fichA>> tamA;
    datosA = new string [tamA];

    for(int i = 0; i < tamA; i++){
        fichA>> datosA[i];
    }

    fichA.close();
}



ifstream fichB("fB.txt");

if(fichB){
    fichB>> tamB;

    datosB = new string [tamB];

    for(int i = 0; i < tamB; i++){
        fichB>> datosB[i];
    }

    fichB.close();
}



tamResultado = tamB - tamA;

resultado = new string [tamResultado];


contador = 0;

for(int i = 0; i < tamB; i++){
    bool enc = true;
    for(int j = 0; j < tamA && enc; j++){
        if(datosB[i] != datosA[j]){
            enc = false;
        }
    }
    if(!enc){
        resultado[contador] = datosB[i];
        contador++;
    }
}

delete[] datosA;
delete[] datosB;



ofstream fout("resultado.txt");
if(fout){
    for(int i = 0; i < tamResultado; i++){
        fout<< resultado[i];
    }
    fout.close();
}

delete[] resultado;

datosA = datosB = resultado = 0;

return 0;   
}

1 个答案:

答案 0 :(得分:0)

检查你的条件。

每当遇到不同的元素时,你都在改变你的旗帜。但是只有当数组A中的所有元素与特定位置的数组B中的所有元素不同时才会发生。

现在编写它的方式,你试图将数组B中的所有四个元素添加到结果数组中,这是因为你试图访问未分配的内存而出现分段错误。

一种可能的解决方案是添加计数器,检查数组A中的两个元素是否与数组B中的元素不同。

这样的事情:

for(int i = 0; i < tamB; i++){
    bool enc = true;
    // counter that keeps track of number of different elements
    int count = 0;
    for(int j = 0; j < tamA && enc; j++){
        if(datosB[i] != datosA[j]){
            count++;
        }
    }
    // check if all elements in datosA are different than datosB[i]
    if(count == tamA){  
        resultado[contador] = datosB[i];
        contador++;
    } }

这应该按预期工作。