Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
lesorub_
2 / 2 / 1
Регистрация: 20.02.2011
Сообщений: 51
#1

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

21.02.2011, 19:07. Просмотров 4861. Ответов 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
#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?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2011, 19:07
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Количество вхождений слова в файл (C++):

Подсчитать количество вхождений слова «мама» в строку и вывести номера первых позиций этих вхождений
Помогите исправить ошибку. Как вывести номера первых позиций вхождений слова...

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

Найти количество вхождений заданного слова в строку
Подскажите, как решить данную задачу? Сама задача:Даны две строки, содержащие...

Найти в тексте количество вхождений определенного слова
Ребята, приветствую! Мне необходимо загрузить из файла текст (перемешанный,...

Определить количество вхождений каждого слова в заданную строку
заданная строка. определить количество вхождения каждого слова в заданую...

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

23
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
}
Кстати мой косяк с функцией. Скобочки как-то перепутал оО
1
lesorub_
2 / 2 / 1
Регистрация: 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 для хранения модифицированной строки, т.е. строки нижнего регистра.

Такое чувство, что пять наврал с указателями...
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
}
1
lesorub_
2 / 2 / 1
Регистрация: 20.02.2011
Сообщений: 51
27.02.2011, 20:03  [ТС] #24
Всё замечательно, только одна проблема - когда в текстовом файле слово вводится с новой строки, то программа его не видит О_о

Всё, проблема решена, просто удалил строчки.
C++
1
2
if(!strcmp(line, ""))
                    break;
Ещё раз ОГРОМНОЕ спасибо FoReVeRy за помощь! Удачи и успехов Вам!
0
27.02.2011, 20:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2011, 20:03
Привет! Вот еще темы с решениями:

Строки. Определить количество вхождений заданного слова в текст
Дано текст и некоторое слово А. Определить количество вхождений заданного слова...

Распечатать количество вхождений заданного слова в каждую строку и заменить его на другое заданное слово
Даны две строки, содержащие не более 100 символов. Строки состоят из слов,...

Считать текст из файла, добавить в конце каждого предложения, количество вхождений в него заданного слова
Вот задание: Написать программу, которая считывает текст из файла и выводит его...

Посчитать количество всех букв и количество вхождений каждой буквы
Есть файл из нескольких строк. нужно: 1 посчитать количество всех букв 2...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru