прекращение вызова после выброса экземпляра 'std :: logic_error' what (): basic_string :: _ M_construct null недопустимо, почему я получаю это? - PullRequest
0 голосов
/ 17 марта 2020

Итак, после рассмотрения потоков stackoverflow с проблемами, схожими / идентичными в проблеме моей ошибки, я думаю, что ошибка заключается в том, что компилятор без ума от какой-то функции возврата строки, где я не возвращаю допустимую строку или что-то в этом роде, но я не могу найти где в коде это происходит. Пожалуйста помоги! Когда я отправляю это присваивание, компилятор говорит «завершить вызов после выброса экземпляра 'std :: logic_error' what (): basic_string :: _ M_construct null not valid"

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

using namespace std;
string transcription(string sequence);
string translatase(string sequence);
string dictionary_read(ifstream &dict,string codon);
void hammings(vector <string> translations);

ifstream frameShift("frameshift_mutations.txt");
ifstream dna("dna2b.txt");
ifstream dict("codons.tsv");
ifstream mutations("mutations.txt");



int main(){
string sequence;
vector <string> translations;
    if (frameShift.fail()) {
        cerr << "File cannot be read, opened, or does not exist.\n";
        exit(1);
    }
while(getline(frameShift,sequence)){
    translations.push_back(transcription(sequence));
}

frameShift.close();

for (int i=0;i<=translations.size();i+=2){

cout<<translatase(translations[i])<<endl;
cout<<translatase(translations[i+1])<<endl;

}

return 0;


}
string translatase(string final){
    string codon="";
    string temp="";
    bool start=false;

    for (int i=0;i<final.length();i++){
        temp+=final[i];
        if (temp.length()==3){
            if (temp=="AUG"){
                start=true;
            }

            else if(((temp=="UAA" || temp=="UAG"|| temp=="UGA" ) && (temp !=""))){
                return codon.substr(0,codon.size()-1);
            }
            if (start){
                codon+= (dictionary_read(dict, temp)+"-");
            }
            temp="";
        }


    }
codon=codon.substr(0,codon.size()-1);
return codon;
}




string transcription(string sequence){
string final="";

    for (int i=0;i<sequence.size();i++){
        if (toupper(sequence[i])==('A')){
            final +="U";
        }
        else if (toupper(sequence[i])==('T' )){
            final +=('A');
        }
        else if( toupper(sequence[i])==('C')){
        final += "G" ;
        }
        else if (toupper(sequence[i])==('G'))
            final +=('C');
        }
    return final;
}




string dictionary_read(ifstream &dict, string codon) {
    string key, value;
    string res="";
    dict.clear(); // reset error state
    dict.seekg(0); // return file pointer to the beginning
    while (dict >> key >> value) {
        if (codon==key){
            res=value;
        }

    }

    return res;

}

1 Ответ

0 голосов
/ 17 марта 2020

Эта ошибка: «завершить вызов после выброса экземпляра 'std :: logic_error' what (): basic_string :: _ M_construct null not valid"
возникает при попытке создать std :: string путем передачи nullptr / NULL в виде char* массива / указателя.

Иначе говоря, очень просто, выполнив это:

const char* ptr = nullptr;
std::string str(ptr); // the exception is thrown from the std::string(const char*) constructor

Как говорит messagee, создание std :: string с помощью nullptr / NULL не является действительным. Некоторые реализации стандартной библиотеки могут принять ее, но она не соответствует стандарту; а ваш нет.

Ваш код слишком длинный, чтобы на первый взгляд быстро определить, где именно это происходит, но, по крайней мере, теперь вы знаете, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...