Разбор номеров с разделителями-пробелами из Getline

Я пишу небольшую программу, которая будет читать простой текстовый файл ASCII, содержащий 3 строки в 5 записях, следующим образом:

f_name l_name
ID#
int int int int

Я успешно поместил первые 2 строки в массивы 1D, где они принадлежат, но у меня возникли проблемы с помещением ряда целых чисел в массив 2D. Мой ближайший подход к решению заключался в использовании строки:

studentScores[row][col] = atoi(input.c_str());

Однако atoi анализирует только первое число, а затем отбрасывает оставшуюся часть строки. Мне нужно поместить каждое число в строке в отдельный элемент массива. Я пытался использовать stringstream, но не могу заставить его работать правильно; по-видимому, функция, которую я хочу использовать, включена в другую версию stringstream, чем я использую.

Что я мог бы использовать для анализа этой строки?


person Opcode    schedule 12.04.2012    source источник
comment
sscanf прочитает строку C и извлечет 4 целых числа, разделенных пробелами.   -  person gbulmer    schedule 12.04.2012
comment
@gbulmer: Предположительно, это для домашней работы или учебного упражнения - если это так, я не думаю, что рекомендовать C API тем, кто изучает C ++, - отличная идея.   -  person ildjarn    schedule 12.04.2012
comment
Да, это для задания по программированию, которое нужно сдать примерно через 3 часа. Я работал над этим всю неделю.   -  person Opcode    schedule 12.04.2012
comment
@Opcode : в будущем отмечайте домашние задания как homework. :-]   -  person ildjarn    schedule 12.04.2012
comment
@ildjarn - OP использует atoi, а atoi и sscanf доступны на C ++, например. cplusplus.com/reference/clibrary/cstdio/sscanf избегая их использования при один застрял - ИМХО хуже, чем не очень хорошая идея :-)   -  person gbulmer    schedule 12.04.2012
comment
@gbulmer: я бы искренне не рекомендовал ОП также использовать atoi.   -  person ildjarn    schedule 12.04.2012
comment
@ildjarn - я считаю, что у них есть несколько подходов к поиску хороших решений. Я провел годы, работая с людьми, которые сталкиваются с крайними сроками (в образовании и в коммерции). По моему опыту, часто приходится преодолевать гораздо больше, чем одну ошибку или препятствие. До тех пор, пока не будет найдено работающее решение, обычно трудно понять, сколько препятствий еще предстоит обнаружить. ИМХО, для некоторых людей добиваться прогресса, признавая, что он неоптимален, часто более ценно, чем делать оптимальный выбор на каждом шагу. Они находят решение, а затем улучшают его с меньшим стрессом и беспокойством.   -  person gbulmer    schedule 13.04.2012
comment
В первом приближении (от которого зависит моя оценка) я рад получить любой код, работающий в рамках моих временных ограничений. Я уже закодировал atoi, но никогда не видел sscanf. Внедрение sscanf задержало бы меня в попытке выяснить, как вписать его в код; то же самое можно сказать и о замене atoi на то, что ildjarn может предложить вместо него. За последнюю неделю я испробовал полдюжины способов доступа к файлу. Мне просто нужен тот, который работает в рамках моих ограничений.   -  person Opcode    schedule 13.04.2012
comment
@ildjarn Я добавил тег домашнего задания. В очередной раз благодарим за помощь!   -  person Opcode    schedule 13.04.2012


Ответы (1)


#include <string>
#include <sstream>

// ...

int ints[4];
std::string input;
std::getline(stream, input);
std::istringstream(input) >> ints[0] >> ints[1] >> ints[2] >> ints[3];

(Обработка ошибок опущена для краткости.)

person ildjarn    schedule 12.04.2012
comment
Будет ли этот код работать с другими типами данных в файле? Я делаю одну строку getline в начале, затем передаю каждую строку в соответствующий массив (string[], int[], scores[][]). - person Opcode; 12.04.2012
comment
@Opcode: Да, он будет работать для любого примитивного типа, а также std::string (хотя в этом случае он будет давать вам только одно слово за раз; если вы хотите больше, используйте std::getline с соответствующим разделителем вместо >>). - person ildjarn; 12.04.2012
comment
FWIW, я только что закончил кодировать свою программу и заставить ее работать правильно. У меня еще есть 1,75 часа, прежде чем я должен сдать его! - person Opcode; 13.04.2012