Question

Je pratique C ++ et j'ai fait une classe qui stocke les séquences lues à partir de format rapide ainsi que de leurs noms. Le code est ci-dessous:

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

using namespace std;

class Sequence {
    vector<string> fullSequence, sequenceNames;

public:
    void fastaRead(string fileName);
    string getSequence(int index);

};

string Sequence::getSequence(int index)
{
    return fullSequence[index];
}


void Sequence::fastaRead(string fileName)
{
    vector<string> fullSequence, sequenceNames;
    ifstream inputFile;
    inputFile.open(fileName);
    if (inputFile.is_open()) {
        string currentSeq;
        string line;
        bool newseq = false;
        while (getline(inputFile, line))
        {
            if (line[0] == '>') {
                sequenceNames.push_back(line.substr(1,line.size()));
                newseq = true;
            } else {
                if (newseq == true) {
                    fullSequence.push_back(currentSeq);
                    currentSeq = line;
                    newseq = false;
                } else {
                    currentSeq.append(line);
                }
            }
        }
    }
    inputFile.close();
}


int main()
{
    Sequence inseq;
    cout << "Fasta Sequence Filepath" << endl;
    string input;
    getline(cin, input);
    inseq.fastaRead(input);
    inseq.getSequence(0);
    return 0;
}

Cependant, lorsque j'exécute le programme avec le fichier d'entrée factice suivant:

>FirstSeq
AAAAAAAAAAAAAA
BBBBBBBBBBBBBB
>SecondSeq
TTTTTTTTTTTTTT
>ThirdSequence
CCCCCCCCCCCCCC
>FourthSequence
GGGGGGGGGGGGGG

Je reçois un défaut de segmentation lorsque la ligne inset.getSequence(0) est appelé. Qu'est-ce que j'ai fait qui provoque la faute SEG et comment puis-je m'assurer que cela ne se produit pas? Je sais que cela peut avoir quelque chose à voir avec les erreurs dans les pointeurs, mais je ne pense pas avoir utilisé des pointeurs qui, si je me souviens bien, nécessitent le caractère *.

Merci, Ben.

Était-ce utile?

La solution

Vous devez supprimer vector<string> fullSequence, sequenceNames; dans le vide Sequence::fastaRead fonction. Lorsque vous définissez ces variables à l'intérieur de cette fonction et que vous les utilisez, vous n'accédez pas à celles de la classe qui portent le même nom, vous accédez aux variables locales que vous avez définies dans cette fonction, sauf si vous les prévenez avec this-> lors de l'accès.

Les variables de la classe sont en fait vides et vous obtenez un défaut de segmentation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top