![]() |
|
Модераторы: bsa |
![]()
|
|
| kachu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
здравствуйте.
Нужно было написать программу, а задание следующее: Имеется телефонный справочник в текстовом формате. В каждой строке файла указаны фамилия, имя, адрес, телефон, дата рождения. Поля разделены пробелом. Записать в новый текстовый файл все данные об однофамильцах. Имена всех файлов задаются в командной строке. программу написал, но очевидно, что первый (внешний) цикл while сработает 1 (один) раз. Подскажите как это можно исправить?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
в обоих циклах один и тот же идентификатор условия окончания цикла (fin) |
|||
|
||||
| kachu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
mes, я понимаю, но не знаю как можно не создавая копию этого потока исправить это, т.е. не создавая ifstream fin2(argv[1]) например.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
сформулировать для начала на словах алгоритм действий.. другими словами: определите, что должен делать Ваш внешний цикл, а что внутренний.. Это сообщение отредактировал(а) mes - 5.6.2013, 18:25 |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
|
|||
|
||||
| kachu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
mes, внешний цикл - перебор строк файла, а внутренний - аналогично перебирает строки того же файла и сравнивает строку, полученную во внешнем цикле со всеми остальными строками.
т.е. аналог
volatile, я думал вернуться в начало файла, но опять же не понял как это реализовать. |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
kachu, я бы отсортировал, (если память конечно позволяет) потом одним циклом вывел всех однофамильцев.
Двойным циклом, как вы хотите будут одни и теже выводицца по нескольку раз, если однофамильцев больше двух. |
|||
|
||||
| kachu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
volatile, спасибо за идею, буду пробовать
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
итого, опираясь на приведенный выше код, Вам нужно два потока от одного источника, при этом поток во внутреннем цикле после истечения должен переокрываться.. Добавлено через 4 минуты и 30 секунд но предложение от volatile реализуется легче и эффективнее (для файлов "нормальной" длины) |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
Можно вообще просто сделать.
(нехорошо поступаю конечно, что готовый ответ даю
Это сообщение отредактировал(а) volatile - 5.6.2013, 20:04 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
volatile, в простой мапе теряется информация о всех однофамильцах...
Добавлено через 1 минуту и 23 секунды плюс боюсь трудновато будет тс с ходу понять... |
|||
|
||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
||||
|
||||
| kachu |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
volatile,
mes, спасибо Вам. по поводу map: нельзя мне использовать, т.к. разрешено использовать только то что даётся преподавателем. проблему с повторным открытием потока в цикле решил, разобрался всё-таки с seekg. использовал такую конструкцию:
всё работает, но замечание
конечно справедливо, но в данном случае можно сдать работу и так. Это сообщение отредактировал(а) kachu - 6.6.2013, 14:16 |
||||
|
|||||
| volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 16 Всего: 85 |
kachu, Молодец! Правильно все сделали. Мне лишь не нравицца алгоритм двойного прохода. мало того что он не правильный, он еще и очень долгий. сложность O(N^2), что при больших N выльецца в очень долгий процесс. Скорей всего, здесь подразумеваецца что справочник отстортирован по фамилиям. Иначе, задание слишком сложное, для новичка не проходившего стл-овские массивы. |
|||
|
||||
| kachu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 30.5.2012 Репутация: нет Всего: нет |
volatile, спасибо за похвалу
по поводу сложности вы видимо правы, из всех заданий это одно помечено "*", и единственное вызвало затруднения |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |