Форум программистов, компьютерный форум CyberForum.ru

Количество вхождений слова в файл - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
lesorub_
2 / 2 / 0
Регистрация: 20.02.2011
Сообщений: 51
21.02.2011, 19:07     Количество вхождений слова в файл #1
Здравствуйте, уважаемые программисты! Нужна Ваша помощь, какая именно, речь пойдет далее

Для начала я скажу, что программа делает, и приложу свой код, который состряпал:

Программа, которая определяет, сколько раз в текстовом файле, не содержащем переносов слов, встречается заданное слово, вводимое с клавиатуры.

Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "stdafx.h"
 
using namespace std;
 
int main()
{
    const int len = 255;
    char word[len], line[len];
    int branch;
    setlocale(LC_ALL, "Russian");
    
    do {
        cout << "Введите слово для поиска: ";
        cin >> word;
        int l_word = strlen(word);
        ifstream fin ("text.txt");
        if (!fin) 
            {
                cout << "Ошибка открытия файла." << endl;
                return 1;
            }
 
    int count = 0;
    
    while (fin.getline(line, len))
    {
        char *p = line;
        
        while(p=strstr(p, word))
        {
            cout << "Cовпадение в подстроке: " << p << endl;
            char *c=p;
            p+=l_word;
            
            if(c!=line)
                if (!ispunct(*(c-1)) && !isspace(*(c-1)))
            continue;
            if (ispunct(*p) || isspace(*p) || (*p == '\0'))
                count++;
        }
    }
    cout << endl << "Слово " << word << " встретилось в файле " << count << " раз(а)." << endl; 
    cout << "\nЧтобы продолжить поиск, нажмите '1'. Чтобы выйти из программы, нажмите '2'.\n";  
    cin >> branch;
        }   
    while (branch!=2);
    return 0;
А вот сами вопросы:

1) как сделать, чтобы поиск производился без учета регистра? (например, пишу в файле слово Cat и cat, слова одинаковые, но разный регистр, соответственно у меня определяет кол-во вхождений cat 1 раз;

2) почему требуется контрольный вывод в строке /*cout << "Cовпадение в подстроке: " << p << endl;*/
Без него программа не определяет символ, стоящий после введенного слова. К примеру, пишу cat и catw, программа без этой строки находит 2 совпадения, считая что cat и catw одинаковые слова.

3) Как в C++ сделать выход из цикла по нажатии клавиш Ctrl+Z?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2011, 19:07     Количество вхождений слова в файл
Посмотрите здесь:

C++ Распечатать количество вхождений заданного слова в каждую строку и заменить его на другое заданное слово
C++ Подсчёт вхождений каждого слова в текстовом файле[C++]
C++ Подсчитать количество вхождений введенного с клавиатуры слова в строку
C++ Вывести в выходной файл все слова, начинающиеся на заданную букву, и их количество
Дан файл f, компоненты которого являются целыми числами. Получить файл g, образованный из файла f исключением повторных вхождений одного и того же чис C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.02.2011, 18:47     Количество вхождений слова в файл #21
lesorub_, Файл точно верно открылся?
А. Нужно создать новую строку. Указатель передается константный, посему сама строка не меняется.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <cstring>
#include <fstream>
 
using namespace std;
 
char* strtolower(const char* str)
{
        char* res=new char[strlen(str)+1];
        strcpy(res, str);
        for(size_t i=0; i<strlen(res); ++i)
                res[i]=tolower(res[i]);
        return res;
}
 
int main()
{       
        const int len = 80;
        char* word;
        char line[len];
    
        ifstream fin ("text.txt");
        fin.getline(line, len);
        word=strtolower(line);
    cout << word;
    delete word;
        return 0;
}
Кстати мой косяк с функцией. Скобочки как-то перепутал оО
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lesorub_
2 / 2 / 0
Регистрация: 20.02.2011
Сообщений: 51
27.02.2011, 19:31  [ТС]     Количество вхождений слова в файл #22
Отлично, там всё переводит как надо Спасибо Вам большое, что помогаете, я недавно купил книжку Джесс Либерти и Бредли Джонс "Освой язык C++ самостоятельно за 21 день". Но к сожалению подробно о строках там говорится очень мало, а до написания собственных функций пока ещё не дошел.

Позвольте уделить мне ещё немного времени(знаю, что надоел). Вот финальная прога, где я хочу реализовать нормальный поиск в файле. Всё ищет, но чувствительна к регистру. Поэтому я спрашивал, как решить эту проблему. Но в итоге при модифицировании программы функцией преобразования строки в нижний регистр, программа вообще не хочет ничего искать. Посмотрите, пожалуйста, что здесь не так, а то 2-й день сижу, мучаюсь, никак не получить желаемый результат.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "stdafx.h"
 
using namespace std; 
char* strtolower(const char* str)
{
        char* res=new char[strlen(str)+1];
        strcpy(res, str);
        for(size_t i=0; i<strlen(res); ++i)
                res[i]=tolower(res[i]);
        return res;
}
 
 
int main()
{
        const int len = 80;
        char word[len]; 
        char line[len];
        char *modline;
        
        setlocale(LC_ALL, "Russian");
        
 
        while(1)
        {  
        cout << "Введите слово для поиска: ";
        if(gets(word)==NULL) goto q;
        
        int l_word = strlen(word);
        ifstream fin ("text.txt");
        if (!fin) 
           {
              cout << "Ошибка открытия файла." << endl;
              return 1;
           }
 
        int count = 0;
        
            while (fin.getline(line, len)) // заносим строку длинной len в переменную line
            {    
                modline=strtolower(line); //превращаем все прописные буквы в строчные
                char *p = modline; // р - для хранения позиции за найденной подстрокой
            while(p=strstr(p, word)) // многократно ищем вхождение подстроки в строку
            {                
                  char *c=p; //c - для хранения адреса начала вхождения подстроки
                  p+=l_word; // перемещаем указатель на длину заданного слова
                        
                   if(c!=modline) // слово не в начале строки?
                      if (!ispunct(*(c-1)) && !isspace(*(c-1))) // символ перед словом не разделитель?
                         continue;
                      if (ispunct(*p) || isspace(*p) || (*p == '\0')) // символ после слова разделитель?
                         count++;
                }
             }
        cout << endl << "Слово " << word << " встретилось в файле " << count << " раз(а). Выход <Ctrl+Z>" << endl << endl; 
     
        }
        q:;
    return 0;
}
В эту версию я добавил переменную modline для хранения модифицированной строки, т.е. строки нижнего регистра.

Такое чувство, что пять наврал с указателями...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
27.02.2011, 19:48     Количество вхождений слова в файл #23
Проверил - работает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <cstring>
#include <iostream>
#include <fstream>
 
using namespace std; 
char* strtolower(const char* str)
{
        char* res=new char[strlen(str)+1];
        strcpy(res, str);
        for(size_t i=0; i<strlen(res); ++i)
                res[i]=tolower(res[i]);
        return res;
}
 
 
int main()
{
        const int len = 255;
        char word[len]; 
        char line[len];
        char *modline;
        char* modword;
                setlocale(LC_ALL, "Russian");
                
 
                while(1)
            {  
            cout << "Введите слово для поиска: ";
                if(gets(word)==NULL) goto q;
                
                int l_word = strlen(word);
                modword=strtolower(word);
        ifstream fin ("text.txt");
        if (!fin) 
           {
              cout << "Ошибка открытия файла." << endl;
              return 1;
           }
 
        int count = 0;
        
                        while (!fin.eof()) // заносим строку длинной len в переменную line
                        {    
                            fin.getline(line, len);
                            if(!strcmp(line, ""))
                                break;
                            modline=strtolower(line); //превращаем все прописные буквы в строчные
                                char *p = modline; // р - для хранения позиции за найденной подстрокой
            while(p=strstr(p, modword)) // многократно ищем вхождение подстроки в строку
                        {                
                  char *c=p; //c - для хранения адреса начала вхождения подстроки
                  p+=l_word; // перемещаем указатель на длину заданного слова
                        
                   if(c!=modline) // слово не в начале строки?
                      if (!ispunct(*(c-1)) && !isspace(*(c-1))) // символ перед словом не разделитель?
                         continue;
                      if (ispunct(*p) || isspace(*p) || (*p == '\0')) // символ после слова разделитель?
                         count++;
                }
                         }
        cout << endl << "Слово " << word << " встретилось в файле " << count << " раз(а). Выход <Ctrl+Z>" << endl << endl; 
     
                }
                q:;
        return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2011, 20:03     Количество вхождений слова в файл
Еще ссылки по теме:

Строки. Определить количество вхождений заданного слова в текст C++
C++ Посчитать количество всех букв и количество вхождений каждой буквы
Найти в тексте все различные слова и число их вхождений C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
lesorub_
2 / 2 / 0
Регистрация: 20.02.2011
Сообщений: 51
27.02.2011, 20:03  [ТС]     Количество вхождений слова в файл #24
Всё замечательно, только одна проблема - когда в текстовом файле слово вводится с новой строки, то программа его не видит О_о

Всё, проблема решена, просто удалил строчки.
C++
1
2
if(!strcmp(line, ""))
                    break;
Ещё раз ОГРОМНОЕ спасибо FoReVeRy за помощь! Удачи и успехов Вам!
Yandex
Объявления
27.02.2011, 20:03     Количество вхождений слова в файл
Ответ Создать тему
Опции темы

Текущее время: 19:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru