我一直在研究一些文件解析器函数的代码来学习一些C ++:
应该读入这个文本文件:
>FirstSeq
AAAAAAAAAAAAAA
BBBBBBBBBBBBBB
>SecondSeq
TTTTTTTTTTTTTT
>ThirdSequence
CCCCCCCCCCCCCC
>FourthSequence
GGGGGGGGGGGGGG
并打印出名称(开头的'>'行),然后打印序列。 但是从输出结果来看:
AAAAAAAAAAAAAABBBBBBBBBBBBBB
TTTTTTTTTTTTTT
CCCCCCCCCCCCCC
FirstSeq
SecondSeq
ThirdSequence
FourthSequence
我们看到不包括G字符的最后一行。代码如下。它的作用是循环遍历行,如果找到名称,则将其附加到名称向量,如果找到序列,则将其附加到临时字符串(如果序列多于一行,就像第一个序列一样),然后当它找到下一个序列的名称时,将构建的临时字符串存储在向量中,然后通过覆盖临时字符串并重新开始来继续。我怀疑这是因为在函数的while循环中:只要先检测到新名称将旧的临时字符串推送到向量上时调用的行fullSequence.push_back(currentSeq);
将不会被调用为G的最后一行因此它没有被包含,虽然记录了名称“FourthSeq”,而是将G的行读入临时字符串,但是然后不传递给向量。那么,我怎样才能做到这一点,因为我可以检测到这是文件的最后一行,所以应该确保将临时字符串推送到向量上?
谢谢, 本。
CODE:
#include<fstream>
#include<iostream>
#include<string>
#include<vector>
void fastaRead(string fileName)
{
ifstream inputFile;
inputFile.open(fileName);
if (inputFile.is_open()) {
vector<string> fullSequence, sequenceNames;
string currentSeq;
string line;
bool newseq = false;
bool firstseq = true;
cout << "Reading Sequence" << endl;
while (getline(inputFile, line))
{
if (line[0] == '>') {
sequenceNames.push_back(line.substr(1,line.size()));
newseq = true;
} else {
if (newseq == true) {
if(firstseq == false){
fullSequence.push_back(currentSeq);
} else {
firstseq = false;
}
currentSeq = line;
newseq = false;
} else {
currentSeq.append(line);
}
}
}
//Report back the sequences and the sequence names...
for ( vector<string>::iterator i = fullSequence.begin(); i != fullSequence.end(); i++) {
cout << *i << endl;
}
for ( vector<string>::iterator i = sequenceNames.begin(); i != sequenceNames.end(); i++) {
cout << *i << endl;
}
cout << fullSequence.size() << endl;
cout << sequenceNames.size() << endl;
inputFile.close();
} else {
perror("error whilst reading this file");
}
if(inputFile.bad()){
perror("error whilst reading this file");
}
}
int main()
{
cout << "Fasta Sequence Filepath" << endl;
string input = "boop.txt";
fastaRead(input);
return 0;
}
答案 0 :(得分:2)
Getline()会在行中找到EOF时“失败”,因此您读取的最后一行不会通过循环。
我已经通过两种方式解决了这个问题,或者只是通过处理循环后的最后一行。
对于两个标志,循环要求两者都为true,当getline()失败时将one设置为false,如果第一个为false,则将另一个设置为false,这将在EOF之后为您提供一个额外的循环。
祝你好运!