如何正确使用getline()将字符串转换为整数?

时间:2016-09-19 17:27:50

标签: c++ getline

我有一个输入txt文件,如下所示:

3 2

ATCGATTGA

GACTATACG

我使用fstream,并将其创建为字符串。然后,我能够将3和2转换为他们自己的单独的整数,但是也希望将接下来的两行转换为整数。我试图使用getline(),因为我被告知这将是最有效的,但无法弄清楚如何创建较低的两个作为他们自己的整数。有关如何使其工作的任何帮助吗?

1 个答案:

答案 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));