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

Поиск слов в файле - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.07.2010, 03:36     Поиск слов в файле #1
Попытался сделать вот эту: Поиск слов в файле

Программу... Сложность ее по-моему мнению, в том, что поиск подстроки должен быть независим от регистра. Поправьте, если я не прав, ибо с регистром это абсолютно без проблем. Но вот я попытался сделать без регистра. Навертел жуткий велосипед. Это не работа с файлом. Просто заготовка. Но я запутался по полной программе. Сижу уже три часа и тупо не могу ее написать. Вот что вышло, за код не ругать, пытался всеми доступными средствами. Да кстати. Обязательно через char.

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 <iostream>
#include <cstdlib>
#include <cstring>
int main()
{
    char str[100];
    std::cout<<"Enter string\n";
    std::cin.getline(str, 100);
    char str2[100];
    std::cout<<"Enter substring\n";
    std::cin.getline(str2,100);
    char str3[100];
    strcpy(str3, str);
    char *ptr;
    char* TempPtr;
    ptr=strtok(str, ".");
    TempPtr=strtok(str3," ");
    while (1)
    {
        if(!stricmp(TempPtr,str2))
        {
            std::cout<<ptr<<'\n';
            break;
        }
        if (strchr(TempPtr,'.')!=0)
            break;
        if(strchr(TempPtr,'.')==0)
            TempPtr=strtok(0, " ");
    }
    while(ptr)
    {
        ptr=strtok(0,".");
        if (ptr)
            while(1)
                {
                    TempPtr=strtok(ptr, " ");
                    if (TempPtr)
                    {
                        if(!stricmp(TempPtr,str2))
                            {
                                std::cout<<ptr<<'\n';
                                break;
                            }
                        if (strchr(TempPtr,'.')!=0)
                            break;
                        if(TempPtr==ptr)
                            break;
                        //if(strchr(TempPtr,'.')==0)
                        //  TempPtr=strtok(0, " ");
                /*      if(TempPtr)
                            {
                                if(!stricmp(TempPtr,str2))
                                    {
                                        std::cout<<ptr<<'\n';
                                        break;
                                    }
                            }
                        else
                            break;*/
                    }
                    else
                        break;
                }
    }
    return 0;
}
Добавлено через 24 минуты
Вот с учетом регистра, а как все же без него?

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
#include <iostream>
#include <cstring>
#include <cstdlib>
int main()
{
    char Str[100];
    std::cout<<"Enter string\n";
    std::cin.getline(Str, 100);
    char SubStr[100];
    std::cout<<"Enter substring\n";
    std::cin.getline(SubStr, 100);
    char*Ptr;
    Ptr=strtok(Str, ".");
    if(strstr(Ptr, SubStr)!=0)
        std::cout<<Ptr<<'\n';
    while (Ptr)
    {
        Ptr=strtok(0, ".");
        if (Ptr)
        {
            if (strstr(Ptr, SubStr)!=0)
                std::cout<<Ptr<<'\n';
        }
    }
    return 0;
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2010, 03:36     Поиск слов в файле
Посмотрите здесь:

Поиск слов в файле C++
Перенос слов в файле C++
Поиск слов в файле. C++
C++ Количество слов в файле. С++
Поиск наиболее часто встречающихся слов в файле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.07.2010, 08:04     Поиск слов в файле #2
создай вектор, где каждый элемент - строка
читай каждое предложение в строку
строку сохраняй в вектор
потом в векторе ищешь нужное предложение

Добавлено через 3 минуты
для слов одной строки можно создать ещё один вектор
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.07.2010, 10:14  [ТС]     Поиск слов в файле #3
Цитата Сообщение от accept Посмотреть сообщение
создай вектор, где каждый элемент - строка
читай каждое предложение в строку
строку сохраняй в вектор
потом в векторе ищешь нужное предложение

Добавлено через 3 минуты
для слов одной строки можно создать ещё один вектор
А без стл? Так подумал вчера ночью... Если и строку и подстроку перевести в нижний регистр, и тогда только искать, будет ли это считаться как выполнение задания?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.07.2010, 10:30     Поиск слов в файле #4
там задание на поиск слова, а слово отделено от других слов
без векторов можно сделать массив указателей
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.07.2010, 10:33  [ТС]     Поиск слов в файле #5
Цитата Сообщение от accept Посмотреть сообщение
там задание на поиск слова, а слово отделено от других слов
Отделено, но я ищу по предложениям, strtok(str, "."). А потом уже ищу вхождение подстроки в строку. Если входит - печатаю это предложение.

програму которая пригласит пользователя ввести слово и будет выводить предложения из файла в которых присудствует данное слово!!!
Формально такое решение подходит. Но можно ли так на практике?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
03.07.2010, 10:35     Поиск слов в файле #6
Цитата Сообщение от Lavroff Посмотреть сообщение
Вот с учетом регистра, а как все же без него?
Можно завести две буферные строки, загружать в них предложение и слово, приводить к одному регистру, затем сравнивать.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.07.2010, 10:37  [ТС]     Поиск слов в файле #7
Цитата Сообщение от kazak Посмотреть сообщение
Можно завести две буферные строки, загружать в них предложение и слово, приводить к одному регистру, затем сравнивать.
Вот. Именно так я и подумал. Но все же, будет ли это решением задачи в практическом смысле? Ведь печатать он будет не предложение, которое в строке было, а предложение которое приведено в нижнему/верхнему регистру. Или же вы имеете ввиду еще две строки, то есть в str2 копировать данные из ptr и приводить ее к нижнему регистру, а в substr2 копировать данные из substr и приводить их к нижнему регистру, если слово входит печать ptr, а ptr каким был таким и остался?
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.07.2010, 10:40     Поиск слов в файле #8
Цитата Сообщение от Lavroff
я ищу по предложениям, strtok(str, ".")
strtok() может понадобиться, когда нужно разделить строку на слова
а так он съедает точку, предложение потом нужно выводить
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
03.07.2010, 10:43     Поиск слов в файле #9
Цитата Сообщение от Lavroff Посмотреть сообщение
Но все же, будет ли это решением задачи в практическом смысле? Ведь печатать он будет не предложение, которое в строке было, а предложение которое приведено в нижнему/верхнему регистру
Для этого буфер и нужен.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.07.2010, 10:43  [ТС]     Поиск слов в файле #10
Цитата Сообщение от accept Посмотреть сообщение
strtok() может понадобиться, когда нужно разделить строку на слова
а так он съедает точку, предложение потом нужно выводить
Предложение то по сути можно выводить и без точки... Хотя...
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.07.2010, 10:48     Поиск слов в файле #11
Цитата Сообщение от Lavroff
Предложение то по сути можно выводить и без точки
не, без точки нельзя
вдруг добавится условие "вывести все такие предложения друг за другом" или "сохранить в новый файл в том же формате, что и исходный"

Добавлено через 1 минуту
это вообще такой знак, когда что-то неудобно написать, начинаешь подгонять задачу под код
значит программа тобой управляет
таким образом не дело сделаешь, а в тупик зайдёшь
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.07.2010, 10:49  [ТС]     Поиск слов в файле #12
accept, В этом плане конечно да.

kazak, Вы имели ввиду вот так?

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
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <fstream>
int main()
{
    FILE*f=fopen("D:\\Test.txt", "r");
    if (!f)
    {
        std::cout<<"File is not open\n"<<'\n';
        return 2;
    }
    char SubStr[100];
    std::cout<<"Enter substring\n";
    std::cin.getline(SubStr, 100);
    char SubStr2[100];
    strcpy(SubStr2, SubStr);
    strlwr(SubStr2);
    char Str[256];
    while (fgets(Str, 256, f)!=0)
    {
    char*Ptr;
    Ptr=strtok(Str, ".");
    char str2[100];
    strcpy(str2, Ptr);
    strlwr(str2);
    if(strstr(str2, SubStr2)!=0)
        std::cout<<Ptr<<'\n';
    while (Ptr)
    {
        Ptr=strtok(0, ".");
        if (Ptr)
        {
            strcpy(str2, Ptr);
            strlwr(str2);
            if (strstr(str2, SubStr)!=0)
                std::cout<<Ptr<<'\n';
        }
    }
    }
    return 0;
}
Добавлено через 38 секунд
Цитата Сообщение от accept Посмотреть сообщение
не, без точки нельзя
вдруг добавится условие "вывести все такие предложения друг за другом" или "сохранить в новый файл в том же формате, что и исходный"

Добавлено через 1 минуту
это вообще такой знак, когда что-то неудобно написать, начинаешь подгонять задачу под код
значит программа тобой управляет
таким образом не дело сделаешь, а в тупик зайдёшь
А как делается через массив указателей?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
03.07.2010, 10:51     Поиск слов в файле #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
вот такой вариант (STL)
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
#include <iostream>
#include <string>
#include <fstream>
#include <conio.h>
 
std::string uptolow(std::string str) {
    for (int i=0;i<strlen(str.c_str());i++)
        if (str[i] >= 0x41 && str[i] <= 0x5A)
            str[i] = str[i] + 0x20;
    return str;
}
 
int main()
{
    std::string wrd="gOOD";
    std::string word=uptolow(wrd);
 
    std::string text,ln;
 
    std::ifstream in("1.txt", std::ios::in | std::ios::binary);
    while (getline(in,text)){
        ln=uptolow(text);
        int i = ln.find(word);
        if (i!=std::string::npos)
            std::cout<<"position="<<i<<std::endl;
    }
 
    return EXIT_SUCCESS;
}
Добавлено через 2 минуты
Цитата Сообщение от Lavroff Посмотреть сообщение
А без стл?
тогда вам надо на с а не на с++?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
03.07.2010, 10:52     Поиск слов в файле #14
Lavroff, да, примерно так.
Demihalf
Унылый школьник
 Аватар для Demihalf
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
03.07.2010, 11:00     Поиск слов в файле #15
Lavroff, а что мешает сделать еще одну строку-оригинал, в которую перед изменением регистра положить исходное предложение? И потом вместо измененной строки выводить ее
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.07.2010, 21:09  [ТС]     Поиск слов в файле #16
PointsEqual, Разве С++ онли стл? оО
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.07.2010, 15:38     Поиск слов в файле #17
Цитата Сообщение от Lavroff Посмотреть сообщение
Разве С++ онли стл?
Нет, конечно. Дело в другом: STL реализует кучу алгоритмов, за отсутствием которых и приходилось бы велосипеды делать. Просто при наличии такого мощного проверенного и отлаженного арсенала городить уродцев, делающих то же самое, но не факт, что правильно, как-то незачем...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.07.2010, 15:42  [ТС]     Поиск слов в файле #18
easybudda, Понятное дело) Но если еще не знаешь стл, а изучаешь все по порядку, то как же быть, кроме как городить велосипеды?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.07.2010, 15:52     Поиск слов в файле #19
Цитата Сообщение от Lavroff Посмотреть сообщение
Но если еще не знаешь стл
Не знаешь - так учи! http://www.cplusplus.com/reference/
На самом деле совсем не так сложно, как может на первый взгляд показаться. Главное вкурить основную концепцию использования этого счастья (контейнеры, итераторы, прочее...). Опять же много книжек есть хороших...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2010, 16:37     Поиск слов в файле
Еще ссылки по теме:

C++ Поиск и замена слов в файле txt
C++ Поиск слов в файле, начинающихся с
Поиск слов в файле C++

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

Или воспользуйтесь поиском по форуму:
Mur3ik
102 / 102 / 4
Регистрация: 12.05.2010
Сообщений: 232
04.07.2010, 16:37     Поиск слов в файле #20
по-моему проще разбивать строку strtok потом сравнивать с искомым словом без учета регистра stricmp
Yandex
Объявления
04.07.2010, 16:37     Поиск слов в файле
Ответ Создать тему
Опции темы

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