gpt4 book ai didi

c++ - 用 C++ 编写的 FASTA 阅读器?

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:56 24 4
gpt4 key购买 nike

首先让我声明我是 C++ 的初学者。无论如何,FASTA 格式如下:任何以“>”开头的行都表示其正下方的基因序列的名称/ID。 id 正下方有一个基因序列。这个基因序列可以是1行,也可以是多行。所以...我想做的是 print: id << ": "<< gene_sequence << endl;

这是我的代码:

#include <iostream>
#include <fstream>

int main(int argc, char **argv) {
if (argc < 2) {
std::cerr << " Wrong format: " << argv[0] << " [infile] " << std::endl;
return -1;
}

std::ifstream input(argv[1]);
if (!input.good()) {
std::cerr << "Error opening: " << argv[1] << " . You have failed." << std::endl;
return -1;
}
std::string line, id, DNA_sequence;
while (std::getline(input, line).good()) {
if (line[0] == '>') {
id = line.substr(1);
std::cout << id << " : " << DNA_sequence << std::endl;
DNA_sequence.clear();
}
else if (line[0] != '>'){
DNA_sequence += line;
}
}
}

对于输入到命令行的第二个参数,这里是我的文件的内容:

>DNA_1
GATTACA
>DNA_2
TAGACCA
TAGACCA
>DNA_3
ATAC
>DNA_4
AT

请复制并粘贴到文本文件中。完成此操作并执行代码后,我想指出问题所在。该代码跳过将 DNA_1 的序列输入到其正确的相应位置,而是将 DNA_1 的序列放入 DNA_2。结果得到向前推进 1。任何帮助或提示将不胜感激?正如我之前所说,我是 C++ 的新手。与 Python 相比,语义很难学习。

最佳答案

我发现您的代码存在一些问题。

首先你在 std::ifstream::good() 上循环,这不起作用,因为它不允许文件结束(即使在良好读取之后也会发生)。

然后您访问 line[0] 而不检查该行是否为空,这可能会导致段错误。

接下来,在收集之前输出“上一行”。

最后你没有输出最后一行,因为循环在找不到另一个 >> 时终止。

我在对您的代码的更正中添加了评论:

#include <iostream>
#include <fstream>

int main(int argc, char **argv) {
if (argc < 2) {
std::cerr << " Wrong format: " << argv[0] << " [infile] " << std::endl;
return -1;
}

std::ifstream input(argv[1]);
if (!input.good()) {
std::cerr << "Error opening: " << argv[1] << " . You have failed." << std::endl;
return -1;
}
std::string line, id, DNA_sequence;

// Don't loop on good(), it doesn't allow for EOF!!

// while (std::getline(input, line).good()) {
while (std::getline(input, line)) {

// line may be empty so you *must* ignore blank lines
// or you have a crash waiting to happen with line[0]
if(line.empty())
continue;

if (line[0] == '>') {
// output previous line before overwriting id
// but ONLY if id actually contains something
if(!id.empty())
std::cout << id << " : " << DNA_sequence << std::endl;

id = line.substr(1);
DNA_sequence.clear();
}
else {// if (line[0] != '>'){ // not needed because implicit
DNA_sequence += line;
}
}

// output final entry
// but ONLY if id actually contains something
if(!id.empty())
std::cout << id << " : " << DNA_sequence << std::endl;

}

输出:

DNA_1 : GATTACA
DNA_2 : TAGACCATAGACCA
DNA_3 : ATAC
DNA_4 : AT

关于c++ - 用 C++ 编写的 FASTA 阅读器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com