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

How do I properly use getline() to turn strings to ints?

本文关键字:转换 字符串 整型 何正确 getline      更新时间:2023-10-16

我有一个输入文本文件,看起来像这样:

2

3

ATCGATTGA

GACTATACG

我正在使用fstream,并将其创建为字符串。然后我就可以把3和2转换成它们各自独立的整型,但是我也想把后面的两行也转换成整型。我试图使用getline(),因为我被告知这将是最有效的,但不知道如何创建较低的两个作为自己的int。有什么可以帮助我的吗?

getline不会将字符串转换为整型。只是不是它的本意。

如果要将ATCGATTGA转换为int,最明显的方法是将输入以4为基数。如果没记错的话,"顺序"通常是A-T-C-G。假设这是正确的,您可以将它们视为A=0, T=1, C=2, G=3,并相应地转换序列(但请注意,对于我们的目的,您选择的顺序并不重要,只要您使用相同的顺序进行编码和解码)。

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型中可以容纳的最大值)。模错误(我还没有测试过这段代码),您应该能够将结果转换回生成它的原始序列。

假设每个原始序列的长度是已知/固定的。如果长度可能不同,你就不知道要包含多少个开头的"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));