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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
#1

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

03.07.2010, 03:36. Просмотров 1395. Ответов 19
Метки нет (Все метки)

Попытался сделать вот эту: Поиск слов в файле

Программу... Сложность ее по-моему мнению, в том, что поиск подстроки должен быть независим от регистра. Поправьте, если я не прав, ибо с регистром это абсолютно без проблем. Но вот я попытался сделать без регистра. Навертел жуткий велосипед. Это не работа с файлом. Просто заготовка. Но я запутался по полной программе. Сижу уже три часа и тупо не могу ее написать. Вот что вышло, за код не ругать, пытался всеми доступными средствами. Да кстати. Обязательно через 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
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2010, 03:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск слов в файле (C++):

Поиск в текстовом файле всех слов, заданных в другом текстом файле - C++
Вообщем такое задание: Поиск в текстовом файле всех слов, заданных в другом текстом файле; Не могу понять почему не работает: ...

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

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

Поиск слов в файле - C++
Разработать программу, которая читает текстовой файл и некоторое слово и выводит те строки файла, которые содержат данное слово. Имя...

Поиск слов в файле, начинающихся с - C++
Необходимо: прочесть текст в файле, вывести все слова, начинающиеся с некоторой буквы. В данном случае - &quot;w&quot;. Искать обязательно через...

Поиск и замена слов в файле txt - C++
Как заменить и найти слова в файле txt на С++. То есть есть файл вот такой структуры AAA БББ BBB 111 222 ыыы

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.07.2010, 08:04 #2
создай вектор, где каждый элемент - строка
читай каждое предложение в строку
строку сохраняй в вектор
потом в векторе ищешь нужное предложение

Добавлено через 3 минуты
для слов одной строки можно создать ещё один вектор
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
03.07.2010, 10:14  [ТС] #3
Цитата Сообщение от accept Посмотреть сообщение
создай вектор, где каждый элемент - строка
читай каждое предложение в строку
строку сохраняй в вектор
потом в векторе ищешь нужное предложение

Добавлено через 3 минуты
для слов одной строки можно создать ещё один вектор
А без стл? Так подумал вчера ночью... Если и строку и подстроку перевести в нижний регистр, и тогда только искать, будет ли это считаться как выполнение задания?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
03.07.2010, 10:30 #4
там задание на поиск слова, а слово отделено от других слов
без векторов можно сделать массив указателей
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
03.07.2010, 10:33  [ТС] #5
Цитата Сообщение от accept Посмотреть сообщение
там задание на поиск слова, а слово отделено от других слов
Отделено, но я ищу по предложениям, strtok(str, "."). А потом уже ищу вхождение подстроки в строку. Если входит - печатаю это предложение.

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

Добавлено через 1 минуту
это вообще такой знак, когда что-то неудобно написать, начинаешь подгонять задачу под код
значит программа тобой управляет
таким образом не дело сделаешь, а в тупик зайдёшь
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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 минуту
это вообще такой знак, когда что-то неудобно написать, начинаешь подгонять задачу под код
значит программа тобой управляет
таким образом не дело сделаешь, а в тупик зайдёшь
А как делается через массив указателей?
0
PointsEqual
ниначмуроФ
835 / 519 / 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 Посмотреть сообщение
А без стл?
тогда вам надо на с а не на с++?
1
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
03.07.2010, 10:52 #14
Lavroff, да, примерно так.
1
Demihalf
Унылый школьник
126 / 60 / 3
Регистрация: 06.11.2009
Сообщений: 354
03.07.2010, 11:00 #15
Lavroff, а что мешает сделать еще одну строку-оригинал, в которую перед изменением регистра положить исходное предложение? И потом вместо измененной строки выводить ее
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2010, 11:00
Привет! Вот еще темы с ответами:

Поиск самых длинных и комбинированных слов в файле - C++
Здравствуйте. У меня есть такая задача: 1. Найти 2 самых длинных комбинированных слова 2. Найти все комбинированные слова в файле ...

Поиск наиболее часто встречающихся слов в файле - C++
Дан символьный файл f, содержащий произвольный текст длиной более 5000 слов. Слова в тексте разделены пробелами и знаками препинания....

Сравнение слов в одном файле со словами в другом файле - C++
Здравствуйте! Суть задачи такая: 1. Первый файл - запросы с городами, второй файл - база городов РФ. Оба txt 2. Найти в запросах все...

Реализовать поиск заданного файла в древе каталогов и поиск указанной информации в этом файле - C++
Имеется много папок в каждой папке есть файл proc.txt, как можно по всем этим папкам пройтись и из каждой папки в этом файле достать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.07.2010, 11:00
Ответ Создать тему
Опции темы

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