我有一个输入txt文件,如下所示:
3 2
ATCGATTGA
GACTATACG
我使用fstream,并将其创建为字符串。然后,我能够将3和2转换为他们自己的单独的整数,但是也希望将接下来的两行转换为整数。我试图使用getline(),因为我被告知这将是最有效的,但无法弄清楚如何创建较低的两个作为他们自己的整数。有关如何使其工作的任何帮助吗?
答案 0 :(得分:0)
getline不会将字符串转换为int。不是它想要做的事情。
如果要将ATCGATTGA
转换为int,显而易见的方法是将输入视为基数4.如果内存服务,则按顺序排列"通常以A-T-C-G给出。假设这是正确的,您可以将它们视为A = 0,T = 1,C = 2,G = 3,并相应地转换序列(但请注意,对于我们的目的,您选择的顺序不是&和#39;真的很重要,只要您使用相同的顺序进行编码和解码)。
int cvt_amino(std::string const &amino) {
int result = 0;
for (char c : amino) {
result *= 4;
switch(c) {
case 'a':
case 'A':
result += 0;
break;
case 't':
case 'T':
result += 1;
break;
case 'c':
case 'C':
result += 2;
break;
case 'g':
case 'G':
result += 3;
break;
default:
throw std::runtime_error("Error: bad argument");
}
}
return result;
}
结果是每个序列的唯一编号(最大值适合int)。 Modulo错误(我还没有测试过这段代码)你应该能够将结果转换回生成它的原始序列。
这确实假设每个原始序列的长度是已知的/固定的。如果长度可能不同,您就不会知道要包含的领先A的数量。在这种情况下,您可能希望切换到基数5,并将映射更改为A = 1,T = 2,C = 3,G = 4。这消除了可变长度输入的模糊性(但减少了适合给定变量大小的最大长度)。
就从文件读取数据而言,它似乎相当微不足道,至少假设我们知道输入格式。对于您上面给出的格式,您可以使用以下格式:
int a, b;
your_file >> a >> b; // read the 3 and 2
// We'll assume an arbitrary number of space-separated sequences after that:
std::string input;
std:vector<int> values;
while (your_file >> input)
values.push_back(cvt_amino(input));