54 lines
1.3 KiB
C++
54 lines
1.3 KiB
C++
|
/** Simple FASTA file format reader
|
||
|
*
|
||
|
* @author The BioloGeeks Team
|
||
|
* @date 2023-09-30
|
||
|
*/
|
||
|
#pragma once
|
||
|
|
||
|
#include <iostream>
|
||
|
#include <fstream>
|
||
|
#include <vector>
|
||
|
|
||
|
class Record {
|
||
|
public:
|
||
|
Record(std::string name, std::string seq) {
|
||
|
this->name = name;
|
||
|
this->seq = seq;
|
||
|
}
|
||
|
|
||
|
std::string name, seq;
|
||
|
};
|
||
|
|
||
|
namespace fasta {
|
||
|
|
||
|
/**
|
||
|
* @see https://www.rosettacode.org/wiki/FASTA_format?section=10#C++
|
||
|
*
|
||
|
*/
|
||
|
std::vector<Record> read_file(std::ifstream &input) {
|
||
|
std::string line, name, content;
|
||
|
std::vector<Record> Records;
|
||
|
// Read fasta file lines and append each FASTA records
|
||
|
// to the Records vector.
|
||
|
while (input.good()) {
|
||
|
std::getline(input, line);
|
||
|
if (line[0] == '>') {
|
||
|
if (!name.empty()) {
|
||
|
Record Record(name, content);
|
||
|
Records.push_back(Record);
|
||
|
name.clear();
|
||
|
content.clear();
|
||
|
}
|
||
|
name = line.substr(1);
|
||
|
} else {
|
||
|
content += line;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!name.empty()) {
|
||
|
Record Record(name, content);
|
||
|
Records.push_back(Record);
|
||
|
}
|
||
|
return Records;
|
||
|
}
|
||
|
}
|