![]() |
|
Модераторы: bsa |
![]()
|
|
| TupDub |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 21.11.2009 Репутация: нет Всего: нет |
Привет Народ, подобные вопросы не раз обсуждались, но я пошарив не нашёл ответа!
Хотелось бы, чтобы моя программа считали колличество строк и слов в файле. Вот файлик:
И ещё при подсчёте количества строк, она не считает пустую строку за строку, пока я там не напечатаю символ какой нить, не понимаю почему.... пример
в этом файле 6 строчек и моя программа считает что 6.
в этом файле тоже шесть, но в шестой нет знака ТАБа как в прошлом примере и моя программа говорит, что строк 5! Может кто подскажет, как это исправить ? Всё без STL только Си. спасибо. |
||||||
|
|||||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Ммапите весь файл в память и считаете количество символов переноса строки, отбрасывая варианты, когда предыдущий символ - тоже перенос строки. Со словами то же, только там пробел - разделитель.
Ваш код не читал, но издалека выглядит ужасно. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
как-то очень сложно...
1. читаешь символ из файла с помощью fgetc 2. проверяешь его с помощью isspace() 3. если false: проверяешь с помощью isalpha(), если true, то присваиваешь word=true 4. иначе, то если word==true, увеличиваешь количество слов и word = false, а если еще и символ == '\n' или -1, то увеличиваешь количество строк Это сообщение отредактировал(а) bsa - 18.1.2010, 16:00 |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
>1. читаешь символ из файла с помощью fgetc
Не делайте так никогда, кроме совсем экзотических случаев, в которых вы поймете, что делать нужно только так и никак иначе. Затрахаете винт неистовыми обращениями, а пока программа будет все это пережевывать, успеете попить чайку. Вместо mmap-а можно читать файл буферами и анализировать их. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
смысл всех функций, работающих с FILE, - буферизация. Т.е. это именно то, о чем ты говоришь, только не нужно самому что-либо делать.
|
|||
|
||||
| shuttle |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.4.2008 Репутация: нет Всего: нет |
зачем проверять каждый символ, считать все строки из файла, параллельно считая их количество
--------------------
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
затем, чтобы посчитать еще и количество слов.
|
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
shuttle, а если строка больше 100 символов?
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Вариант shuttle вообще не "катит", так как у ТС русским языком написано про язык Си.
|
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
bsa, буферизуется возможно, да. Но вариант с нормальным буфером - 1 сек, посимвольное чтение - 42 сек.
ЗЫ. файл - гиг с хвостиком ЗЗЫ.
ЗЗЗЫ. Дефолтная оптимизация на максимуме (-O3). Это сообщение отредактировал(а) djamshud - 18.1.2010, 15:19 -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
djamshud, по скорости я спорить не буду (так как знаю, что на вызов fgetc тратится время, а, учитывая объемы, - существенное). Сам стараюсь не пользоваться всем что связано с FILE. Но в данном случае, я считаю, что ТС будет проще написать код по моему совету, а потом объяснить его.
djamshud, ты бы хоть код отформатировал. Какой пример новичкам подаешь? |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
bsa, новичку, я думаю, в любом случае нужно хотя бы знать, как правильнее делать в принципе.
Поправил, сорри. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| TupDub |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 21.11.2009 Репутация: нет Всего: нет |
bsa,
djamshud, Спасибо за ответы... буду пробыаать! о результатах напишу! может не совсем в этото топик вопрос, но не хочу флудить... От чего при запуске это проги в винде возникает ошибка: An unhandled win32 exception occurred in main.exe. ? ? ? Это сообщение отредактировал(а) TupDub - 18.1.2010, 18:14 |
|||
|
||||
| djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 4 Всего: 39 |
Этой - моей? Неправильно обработано условие невозможности открыть файл на чтение, не обработана возможная ошибка чтения файла. Это как минимум.
Этот пример я писал скорее товарищу bsa, чтобы показать убогость посимвольного чтения, он показывает идею, как в принципе нужно делать, и не претендует на звание "хорошего". "Как нужно" - ИМХО конечно и при условии не использования отображения файла в память - некроссплатформенного системного вызова. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
| shuttle |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 230 Регистрация: 9.4.2008 Репутация: нет Всего: нет |
по больше буфер сделать.
Я просто идею подсказал, что бы считывание посрочно было, т.к. до моего поста только по символьно. И написано не использовать STL. --------------------
|
||||
|
|||||
![]()
|
| Правила форума "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. |