vector in der Funktion - wie man Sie wieder
Ich habe eine Funktion, die sollte Lesen aus der Datei eine Zeile, die das Lesen Stoppt, wenn eine Zeile beginnt nicht mit '>' oder ' '. Es sollte speichern die Zeilen in Vektor-und zurück.
Dies ist der code:
#include <cstdlib>
#include <iostream>
#include <string>
#include <stdio.h>
#include <fstream>
#include <vector>
using namespace std;
string getseq(char * db_file) //gets sequences from file
{
string seqdb;
vector<string> seqs;
ifstream ifs(db_file);
string line;
//vector<char> seqs[size/3];
while(ifs.good())
{
getline(ifs, seqdb);
if (seqdb[0] != '>' & seqdb[0]!=' ')
{
seqs.push_back(seqdb);
}
}
ifs.close();
//return seqs;
//return seqs;
}
int main(int argc, char * argv[1])
{
cout << "Sequences: \n" << getseq(argv[1]) << endl;
return 0;
}
Compiler (g++) gibt:
fasta_parser.cpp: In function ‘std::string getseq(char*)’:
fasta_parser.cpp:32: error: conversion from ‘std::vector<std::basic_string<char, `std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >’ to non-scalar type ‘std::string’ requested`
Wer hat eine Idee?
Bearbeiten:
Als Skurmendel Fragen, ich bin das hinzufügen von code, weil der Speicher-Sicherheits-Verletzung nach
Ausführung von kompiliertem code:
#include <cstdlib>
#include <iostream>
#include <string>
#include <stdio.h>
#include <fstream>
#include <vector>
using namespace std;
vector<string> getseq(char * db_file) //pobiera sekwencje z pliku
{
string seqdb;
vector<string> seqs;
ifstream ifs(db_file);
string line;
//vector<char> seqs[size/3];
while(ifs.good())
{
getline(ifs, seqdb);
if (seqdb[0] != '>' & seqdb[0]!=' ')
{
seqs.push_back(seqdb);
}
}
ifs.close();
return seqs;
}
int main(int argc, char * argv[1])
{
vector<string> seqs; //Holds our strings.
getseq(argv[1]); //We don't return anything.
//This is just a matter of taste, we create an alias for the vector<string> iterator type.
typedef vector<string>::iterator string_iter;
//Print prelude.
cout << "Sekwencje: \n";
//Loop till we hit the end of the vector.
for (string_iter i = seqs.begin(); i != seqs.end(); i++)
{
cout << *i << " "; //Do processing, add endlines, commas here etc.
}
cout << endl;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich verstehen Sie, Ihre getseq() zurückgeben sollte, einen Vektor von Zeichenketten. Daher sollten Sie ändern
zu
Und wenn Sie wollen, drucken Sie es auf main() sollte man es in einer Schleife.
std::copy(str_vec.begin(), str_vec.end(), std::ostream_iterator<std::string>(cout, "\n"));
.du versuchen, wieder ein Vektor und Ihre Methode muss eine Zeichenkette zurückgeben.
haben Sie vielleicht zu ändern, eine Signatur-Methode zu
Ihre Funktion
getseq
deklariert ist zurückstd::string
aber Sie versuchen, um return Wert von einem anderen Typ -std::vector
- daher haben Sie die compiler-Fehler. Müssen Sie die rückgabevariable vom Typstd::string
(erstellt durch die Verkettung der Elemente des Vektors).Ihre Funktion könnte wie folgt Aussehen:
Hinweis: die Zeichenfolge, die Sie zurückkehren aus einer Funktion kann durchaus großes Objekt und Rückgabe von Wert kann teuer werden als das, was tatsächlich kehrte in diesem Fall wird eine Kopie des Objekts (konstruiert durch aufrufen der copy-Konstruktor). Es wäre effizienter, wenn dein string ist deklariert als out-parameter, die Sie füllen Sie einfach in der Funktion:
void getseq(char* db_file, string& strSeqs);
Gut, Sie versuchen, um return Vektor als strings. Das wird nicht funktionieren, weil Sie sind verschiedene Arten und haben keine Konvertierung definiert, die von einem zum anderen. Die Funktion der return-Typ
string
.Lösung 1
In Ihrem Fall könnten Sie fügen Sie die Zeilen zu einem string, anstatt Sie zu addieren, um einen Vektor? Sie sind mit dem Ergebnis als string wie auch immer.
Könnte man ändern seqs zu
string
und fügen Sie die Daten mit der+=
Betreiber.Lösung 2
Könnten Sie auch ändern Sie den Rückgabetyp zu
vector<string>
aber würden Sie brauchen, um eine Schleife über die Elemente, und drucken Sie Sie stattdessen in Ihrermain
.Caveat Lector: dies wird kopieren Sie alle Elemente. Wenn Sie dies vermeiden wollen übergeben Sie den Vektor als Referenz an die Funktion hinzufügen, um es.
Looping ist Recht einfach mithilfe von Iteratoren:
Wenn Sie vermeiden möchten, kopieren von Vektor-und alle Saiten machen
getseq
nehmen Sie einen Verweis auf einevector<string>
.Würden Sie dann brauchen, um das
vector<string>
in deiner main statt, wodurch meine obige code:Bearbeiten nach Kommentaren
getseq
werden Sie wahrscheinlich wollen, um zu überprüfen, ob diegetline
gelang es auch, die Sie verwenden könnenif (getline(ifs, seqdb)) { /* success */ } else { /*failure*/ }
void getseq(char * db_file, vector<string> &seqs)
. Dann entfernen Sie die Zeilevector<string> seqs;
von innen getseq. Dies wird Ihr problem lösen. Ich habe zwei verschiedene version meiner Antwort, die man gibt einen Vektor, und eine, die hängt an ihm. So wie es jetzt ist haben Sie... naja, etwas dazwischen.