|
Модераторы: bsa |
|
шарлотта |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 1.3.2017 Репутация: нет Всего: нет |
Здравствуйте! В текстовом файле требуется определить в каждой строке количество слов, длина которых больше 4. Вывести количество найденных слов и сами слова. Удалить из файла строку, в которых таких слов меньше всего.Если таких слов нет - оставить файл без изменений.
void CountDelete(FILE *f, FILE *g) { int i, j = 0, len = 0, count = 0, num_line_min, cur_num_line = 0, count_min = 1.0e+10; char line[100]; char word[100]; char buf[100] = {'\0'}; bool key = false; f = fopen("first.txt", "r"); while (fgets(line, 100, f) != NULL) { for (i = 0; i <= strlen(line); i++) { if ((line[i] != ' ') && (line[i] != '\0') { word[j] = line[i]; len++; j++; } else { if (len > 4) { word[j] = '\0'; count++; buf[strlen(buf)] = ' '; strcat(buf, word); } word[0] = '\0'; len = 0; j = 0; } if (line [i] == '\0') { if ((count < count_min) && (count != 0)) { key = true; count_min = count; num_line_min = cur_num_line; } strcpy(buf, buf + 1); printf("count = %d\n ", count); if (count != 0) { puts(buf); } cur_num_line++; count = 0; buf[0] = '\0'; fflush(stdin); } } } if (key == true) { printf("count_min = %d\n ", count_min); printf("num_line_min = %d\n ", num_line_min); cur_num_line = 0; fseek(f,0L,SEEK_SET); while (fgets(line, 100, f) != NULL) { if (cur_num_line != num_line_min) { fputs(line, g); } cur_num_line++; } //и после этого удалить старый файл и переименовать новый } else { puts("Нет слов, длиннее 4"); } fclose(f); fclose(g); } Определение нужной строки неверно работает при определении последнего слова(если я верно понимаю, из-за того, что после идет пробел) и при работе с несколькими строками. Во второй файл ничего не пишет. Не могу разобраться, как исправить ошибки. Большое спасибо за помощь! Это сообщение отредактировал(а) шарлотта - 18.4.2017, 00:21 Присоединённый файл ( Кол-во скачиваний: 4 ) текстовые_1.png 957,54 Kb |
|||
|
||||
шарлотта |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 1.3.2017 Репутация: нет Всего: нет |
Так при работе с несколькими строками
Присоединённый файл ( Кол-во скачиваний: 2 ) текстовые_2.png 811,99 Kb |
|||
|
||||
rudolfninja |
|
|||
Опытный Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
Как-то у вас тяжело код написан.
Поместите между соответсвующими тегами и было бы здорово, если бы вы добавили комментарии к каждой логически обособленной части функции. По делу сразу могу сказать, что я бы еще на вашем месте проверял line[i] на '\n', а не только на '\0', как признак конца строки. |
|||
|
||||
шарлотта |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 1.3.2017 Репутация: нет Всего: нет |
Это сообщение отредактировал(а) шарлотта - 18.4.2017, 18:51 |
|||
|
||||
rudolfninja |
|
|||
Опытный Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
В вашем случае слово может заканчиваться и на '\n', а не только на пробел и на '\0'
|
|||
|
||||
шарлотта |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 1.3.2017 Репутация: нет Всего: нет |
Сделала так.
Мне кажется, теперь ошибка в том, что не обнуляет buf. При выводе второй строки соединяет часть предыдущей и новую. Это сообщение отредактировал(а) шарлотта - 18.4.2017, 22:46 |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
|
|||
|
||||
rudolfninja |
|
||||
Опытный Профиль Группа: Участник Сообщений: 341 Регистрация: 19.2.2013 Где: г. Минск Репутация: 1 Всего: 6 |
В общем, вот рабочий вариант. Я не знаю, что пишется в файл, но слова выводит верно для каждой строки:
Вы не правильно очищали массив, в котором было слово и буфер со словами, которые нужно вывести. word[0]='\0' не очищает весь массив, а только зануляет первый элемент, оставив остальные элементы неизменными. Получается, что вы накладываете слова друг на друга. Я очищаю массив с помощью функции memset. Еще я решил, что лучше будет сразу заменить символ перевода строки ('\n') на символ конца строки ('\0') при чтении строки из файла:
В общем, разбирайтесь. Если будут вопросы или что то не будет работать, пишите, завтра попробуем найти ошибку. |
||||
|
|||||
шарлотта |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 55 Регистрация: 1.3.2017 Репутация: нет Всего: нет |
Большое Вам спасибо! Попробую разобраться.
|
|||
|
||||
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |