Wednesday, July 25, 2018

c++ - vector in function - how to do return




I've got a function that should read from file line by line, the reading stops when a line does not begin with '>' or ' '. It should store the lines in vector and return it.
This is code:



    #include 
#include
#include
#include
#include
#include

using namespace std;


string getseq(char * db_file) // gets sequences from file
{
string seqdb;
vector seqs;
ifstream ifs(db_file);
string line;

//vector 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++) returns:



    fasta_parser.cpp: In function ‘std::string getseq(char*)’:
fasta_parser.cpp:32: error: conversion from ‘std::vector, std::allocator >, std::allocator, std::allocator > > >’ to non-scalar type ‘std::string’ requested`


Anyone has any idea?




Edit:
As Skurmendel ask, I am adding whole code because of memory security violation after



executing compiled code:



#include 
#include
#include
#include
#include

#include

using namespace std;

vector getseq(char * db_file) // pobiera sekwencje z pliku
{
string seqdb;
vector seqs;
ifstream ifs(db_file);
string line;


//vector 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 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 iterator type.
typedef vector::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;
}

Answer



If I understood you, your getseq() should return a vector of strings. Therefore you should change



string getseq(char * db_file)



to



vector getseq(char * db_file)


And if you want to print it on main() you should do it in a loop.



int main() {

vector str_vec = getseq(argv[1]);
for(vector::iterator it = str_vec.begin(); it != str_vec.end(); it++) {
cout << *it << endl;
}
}

No comments:

Post a Comment

plot explanation - Why did Peaches&#39; mom hang on the tree? - Movies &amp; TV

In the middle of the movie Ice Age: Continental Drift Peaches' mom asked Peaches to go to sleep. Then, she hung on the tree. This parti...