如何正确使用getline()将字符串转换为整型?
How do I properly use getline() to turn strings to ints?
我有一个输入文本文件,看起来像这样:
23
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));
相关文章:
- wcstombs_s(),转换字符串的长度
- 使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?
- 无法转换字符串插入函数的参数
- 转换字符串向量:基于先前的值跳过元素
- 从中间器转换字符串不起作用,出了什么问题?
- 失败的证明转换字符串到枚举类
- 如何使用正则表达式和提升转换迭代器标记和转换 c 字符串
- 使用java jni时转换字符串类型
- 如何避免在转换字符串令牌流时重复istringstream构造
- 阿托伊未正确转换字符串
- C++,转换字符串,使连续下划线序列变为单个下划线
- 使用长算术转换字符串
- 转换字符串十进制数时的精度
- 将词法转换字符串提升为双精度
- 使用marshal_as函数转换字符串的性能
- C++不会从数据转换字符串
- 无论如何,在c++ /Qt中转换字符串到结构中的字段
- C++ 隐式类型转换字符串 -> int?
- 转换字符串到浮点数,c++实现
- 用于转换字符串大小写的函数