vecteur en fonction de comment le faire revenir
J'ai une fonction qui doit lire à partir d'un fichier ligne par ligne, la lecture s'arrête dès qu'une ligne ne commence pas par " >' ou'. Il doit stocker les lignes dans le vecteur et le retourner.
C'est 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;
}
Compilateur g++) retourne:
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`
Quelqu'un a une idée?
Edit:
Comme Skurmendel demander, je suis l'ajout de code entier de mémoire à cause de violation de la sécurité après
l'exécution de code compilé:
#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;
}
Que voulez-vous revenir? Le vecteur ou la chaîne?
Don't utiliser while (en streaming. good ()).
vecteur @Fred Nurk: le Pourquoi et ce que je dois utiliser à la place?
Don't utiliser while (en streaming. good ()).
vecteur @Fred Nurk: le Pourquoi et ce que je dois utiliser à la place?
OriginalL'auteur Mateusz Korycinski | 2011-02-03
Vous devez vous connecter pour publier un commentaire.
Si j'ai bien compris vous, votre getseq() doit retourner un vecteur de chaînes de caractères. Par conséquent, vous devriez changer de
à
Et si vous voulez l'imprimer sur le main (), vous devez le faire dans une boucle.
std::copy(str_vec.begin(), str_vec.end(), std::ostream_iterator<std::string>(cout, "\n"));
.J'ai essayé mais j'obtiens l'erreur similaire à celle décrite ci-dessous (ci-dessous Skurmedel réponse).
OriginalL'auteur vtorhonen
vous essayez de retourner un vecteur et votre méthode doit retourner une chaîne.
vous devrez peut-être modifier une signature de méthode pour
OriginalL'auteur DesignFirst
Votre fonction
getseq
est déclarée pour retournerstd::string
mais vous essayez de renvoyer la valeur d'un autre type -std::vector
- donc vous avez cette erreur du compilateur. Vous avez besoin de retourner une variable de typestd::string
(créé par la concaténation d'éléments de vecteur).Votre fonction pourrait ressembler à ceci:
Note: chaîne de caractères, vous êtes de retour d'une fonction peut être assez grand objet et en le retournant par la valeur peut être cher que ce qui est effectivement retourné dans ce cas est une copie de cet objet (construit en invoquant le constructeur de copie). Il serait plus efficace si votre chaîne est déclarée comme paramètre de sortie qui vous suffit de remplir l'intérieur de la fonction:
void getseq(char* db_file, string& strSeqs);
OriginalL'auteur Bojan Komazec
Bien, vous essayez de renvoyer un vecteur de chaînes de caractères. Cela ne peut pas fonctionner, car ils sont de types différents et n'ont pas de conversion défini à partir de l'une à l'autre. Votre fonction est le type de retour
string
.Solution 1
Dans votre cas, vous pouvez ajouter des lignes à une chaîne, au lieu de les ajouter à un vecteur? Vous utilisez le résultat sous forme de chaîne de toute façon.
Vous pouviez changer seqs à
string
et d'ajouter des données à l'aide de l'+=
de l'opérateur.Solution 2
Vous pouvez également changer le type de retour de
vector<string>
mais vous devez faire une boucle sur les éléments et de les imprimer à la place de votremain
.Caveat Lector: cela permet de copier tous les éléments. Si vous voulez éviter ce pass le vecteur comme une référence à la fonction et ajouter à elle.
La boucle est très facile à l'aide des itérateurs:
Si vous voulez éviter la copie d'un vecteur et toutes les chaînes de rendre
getseq
prendre une référence à unvector<string>
.Vous devez créer le
vector<string>
de votre main au lieu de cela, faire mon code ci-dessus:Modifier après les commentaires
Mateusz K: Ok 🙂 j'ai ajouté un peu plus de chair à ma réponse.
Merci. 🙂 Malheureusement après que j'ai compilé, et d'exécution (./fpars seqs.fasta), il retourne quelques signes (comme dans le fichier binaire) et de la déclaration: Violation de la mémoire de la sécurité. J'ai cette déclaration en polonais, donc je ne sais pas l'anglais analogique. :/
K: C'est malheureux, pourriez-vous ajouter votre nouveau code pour le fond de la question? Je suis sûr que quelque chose, quelque part, en faire des choses avec la mémoire, il ne devrait pas.
Ok, je vais le poster.
OriginalL'auteur Skurmedel