Разбивать неловкие cstring на разные массивы?
Итак, вот сделка. Это школьный проект, и мы не можем использовать #include
Adam Zeller 452231 78 86 91 64 90 76
Barbara Young 274253 88 77 91 66 82
Carl Wilson 112231 87 77 76 78 77 82
Обратите внимание, что между деталями есть случайное количество пробелов. По сути, мне нужно получить имена (как имя, так и фамилия могут различаться по длине), прочитать идентификатор студента в целое число, а затем прочитать все остальные их оценки (предпочтительно в массив int). Кроме того, они могут иметь 5 или 6 классов, программа должна быть в состоянии справиться либо. Как в мире я могу сортировать эти данные? Я подумал, что, возможно, я смогу получить getline() в массив символов cstring всей строки, а затем разделить каждый бит соответственно на каждый массив, но я просто не знаю, как это сделать. Неопределенно, я не хочу, чтобы кто-нибудь давал мне какой-либо код, но, возможно, укажет мне правильное направление, как я мог бы сделать это. Сортировка строки данных по различным переменным, а также учет 5 или 6 классов без влияния на данные, а также список может быть длиной до 60 строк (то есть иметь до 60 учеников, но не более того). Это только часть проекта, но, кажется, это та часть, которую я не могу пройти. Опять же, я не хочу никакого кода или прямых ответов, возможно, просто укажи мне правильное направление, которым я мог бы пойти по этому поводу. Спасибо!
3 ответа
Я думаю, вы можете выполнить следующие шаги:
read a line
get the words from the line
first two words are first and last names
rest of the words are number, use atoi to get the numbers from string
continue the above till EOF
Как вы получаете слова? Может быть "isspace" c библиотечной функцией поможет
Я не собираюсь публиковать какой-либо код (как требуется), но рассмотрите возможность фильтрации каждой строки через strtok
, strtok
разбивает строку на токены, где они могут быть расположены или сохранены так, как вам нравится. Смотрите здесь для получения дополнительной информации: http://www.cplusplus.com/reference/cstring/strtok/
Технически, это хитрый проект / вопрос.
Самая сложная часть синтаксического анализа строк в файле, как вы сказали, - работа со случайным количеством пробелов.
Поскольку вы не запрашивали код, я дам вам несколько советов, основанных на том, что вы предложили:
Вы знаете, что размер каждой строки составляет максимум 250 символов (включая символ новой строки?) - это длина каждой строки, и, как таковая, поскольку она происходит с такой регулярностью, вы можете читать столько символов одновременно с обычными файловыми функциями, или, используя fstreams (как выведено из вашего тега).
Единственная проблема - хранение этих токенов. Если вы заранее знаете, сколько вы будете хранить, вы можете определить массив с-строк (так как вы не можете использовать <string>
) состоит из максимального числа, которое, как вы думаете, произойдет. Однако, так как это ненадежно и немного неэффективно (так как это пустая трата памяти, если вы выбираете слишком много строк для хранения), вы можете сделать ее динамичной. В связи с этим у вас есть возможность использовать контейнер C++, такой как <vector>
, для удобства доступа и хранения.
После этого вычислить значения данных в каждой строке относительно просто:
Сначала посмотрите на свои данные, что вы наблюдаете?
- Каждый отдельный фрагмент данных (токен в разборе номенклатуры) ограничен хотя бы одним пробелом.
- Кроме того, имена являются первыми двумя токенами любой строки и не содержат цифр в них.
Следовательно, все, что не имеет пробела или числа, принадлежит строке, в данном случае: части имени.
Все, что вам нужно сделать, это перебрать структуру контейнера / данных, которую вы использовали для хранения c-строк, и проанализировать их, используя критерии, описанные выше.