2016-09-19 5 views
-1

У меня есть текстовый файл ввода, который выглядит так:Как правильно использовать getline() для преобразования строк в ints?

ATCGATTGA

GACTATACG

Я использую fstream, и создавать его в виде строки. Затем я могу превратить 3 и 2 в свои собственные ints, но также хочу также перевести следующие две строки в ints. Я пытаюсь использовать getline(), потому что мне говорят, что это будет наиболее эффективным, но не может понять, как создать нижние два как свои собственные ints. Любая помощь в том, как заставить это работать?

+0

Ждать, вы хотите преобразовать 'ATCGATTGA' в целое число? Как это возможно? – Rakete1111

+0

Для этого вы используете 'std :: istringstream' или' std :: stoi'. –

+0

То, как я получил первые два, это string.at (0) и string.at (2), но не похоже, что это было бы жизнеспособно для следующих строк. Файл txt всегда будет иметь тот же формат, но второй номер всегда будет содержать следующие строки ниже. – Chief

ответ

0

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)); 
+0

проблема заключается в том, как я выбираю строки из основной строки, чтобы затем преобразовать в ints? – Chief

+0

@Chief: Отредактировано, чтобы включить хотя бы некоторое представление о том, как с этим справиться. –

+0

Это работает до тех пор, пока вход имеет фиксированную длину, которую вы можете рассмотреть во время «ресериализации». В противном случае, если у вас есть ведущая 'A', длина будет потеряна; вы не можете воссоздать исходную строку из вашего целого. Таким образом, эта схема не является фактически «уникальной для каждой последовательности». –