getline не собирается преобразовывать строку в int. Просто не то, что он собирается делать.
Если вы хотите преобразовать 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). Ошибки Modulo (я не тестировал этот код), вы должны иметь возможность преобразовать результат обратно в исходную последовательность, которая сгенерировала его.
Это предполагает, что длина каждой исходной последовательности известна/установлена. Если длины могут отличаться, вы не будете знать число ведущих «А», которые нужно включить. В таком случае вы, вероятно, захотите перейти на базу 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));
Ждать, вы хотите преобразовать 'ATCGATTGA' в целое число? Как это возможно? – Rakete1111
Для этого вы используете 'std :: istringstream' или' std :: stoi'. –
То, как я получил первые два, это string.at (0) и string.at (2), но не похоже, что это было бы жизнеспособно для следующих строк. Файл txt всегда будет иметь тот же формат, но второй номер всегда будет содержать следующие строки ниже. – Chief