Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1

Поиск слов в файле

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

Author24 — интернет-сервис помощи студентам
Попытался сделать вот эту: Поиск слов в файле

Программу... Сложность ее по-моему мнению, в том, что поиск подстроки должен быть независим от регистра. Поправьте, если я не прав, ибо с регистром это абсолютно без проблем. Но вот я попытался сделать без регистра. Навертел жуткий велосипед. Это не работа с файлом. Просто заготовка. Но я запутался по полной программе. Сижу уже три часа и тупо не могу ее написать. Вот что вышло, за код не ругать, пытался всеми доступными средствами. Да кстати. Обязательно через 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.07.2010, 03:36
Ответы с готовыми решениями:

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

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

Поиск слов в файле
Здравствуйте. У меня такая задача: Разработать программу, которая осуществляет в текстовом файле...

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

19
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.07.2010, 08:04 2
создай вектор, где каждый элемент - строка
читай каждое предложение в строку
строку сохраняй в вектор
потом в векторе ищешь нужное предложение

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

Добавлено через 3 минуты
для слов одной строки можно создать ещё один вектор
А без стл? Так подумал вчера ночью... Если и строку и подстроку перевести в нижний регистр, и тогда только искать, будет ли это считаться как выполнение задания?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.07.2010, 10:30 4
там задание на поиск слова, а слово отделено от других слов
без векторов можно сделать массив указателей
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.07.2010, 10:33  [ТС] 5
Цитата Сообщение от accept Посмотреть сообщение
там задание на поиск слова, а слово отделено от других слов
Отделено, но я ищу по предложениям, strtok(str, "."). А потом уже ищу вхождение подстроки в строку. Если входит - печатаю это предложение.

програму которая пригласит пользователя ввести слово и будет выводить предложения из файла в которых присудствует данное слово!!!
Формально такое решение подходит. Но можно ли так на практике?
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
03.07.2010, 10:35 6
Цитата Сообщение от Lavroff Посмотреть сообщение
Вот с учетом регистра, а как все же без него?
Можно завести две буферные строки, загружать в них предложение и слово, приводить к одному регистру, затем сравнивать.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.07.2010, 10:37  [ТС] 7
Цитата Сообщение от kazak Посмотреть сообщение
Можно завести две буферные строки, загружать в них предложение и слово, приводить к одному регистру, затем сравнивать.
Вот. Именно так я и подумал. Но все же, будет ли это решением задачи в практическом смысле? Ведь печатать он будет не предложение, которое в строке было, а предложение которое приведено в нижнему/верхнему регистру. Или же вы имеете ввиду еще две строки, то есть в str2 копировать данные из ptr и приводить ее к нижнему регистру, а в substr2 копировать данные из substr и приводить их к нижнему регистру, если слово входит печать ptr, а ptr каким был таким и остался?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.07.2010, 10:40 8
Цитата Сообщение от Lavroff
я ищу по предложениям, strtok(str, ".")
strtok() может понадобиться, когда нужно разделить строку на слова
а так он съедает точку, предложение потом нужно выводить
1
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
03.07.2010, 10:43 9
Цитата Сообщение от Lavroff Посмотреть сообщение
Но все же, будет ли это решением задачи в практическом смысле? Ведь печатать он будет не предложение, которое в строке было, а предложение которое приведено в нижнему/верхнему регистру
Для этого буфер и нужен.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.07.2010, 10:43  [ТС] 10
Цитата Сообщение от accept Посмотреть сообщение
strtok() может понадобиться, когда нужно разделить строку на слова
а так он съедает точку, предложение потом нужно выводить
Предложение то по сути можно выводить и без точки... Хотя...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
03.07.2010, 10:48 11
Цитата Сообщение от Lavroff
Предложение то по сути можно выводить и без точки
не, без точки нельзя
вдруг добавится условие "вывести все такие предложения друг за другом" или "сохранить в новый файл в том же формате, что и исходный"

Добавлено через 1 минуту
это вообще такой знак, когда что-то неудобно написать, начинаешь подгонять задачу под код
значит программа тобой управляет
таким образом не дело сделаешь, а в тупик зайдёшь
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
03.07.2010, 10:51 13
Лучший ответ Сообщение было отмечено ForEveR как решение

Решение

вот такой вариант (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
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
03.07.2010, 10:52 14
Lavroff, да, примерно так.
1
Унылый школьник
126 / 60 / 10
Регистрация: 06.11.2009
Сообщений: 353
03.07.2010, 11:00 15
Lavroff, а что мешает сделать еще одну строку-оригинал, в которую перед изменением регистра положить исходное предложение? И потом вместо измененной строки выводить ее
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.07.2010, 21:09  [ТС] 16
PointsEqual, Разве С++ онли стл? оО
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
04.07.2010, 15:38 17
Цитата Сообщение от Lavroff Посмотреть сообщение
Разве С++ онли стл?
Нет, конечно. Дело в другом: STL реализует кучу алгоритмов, за отсутствием которых и приходилось бы велосипеды делать. Просто при наличии такого мощного проверенного и отлаженного арсенала городить уродцев, делающих то же самое, но не факт, что правильно, как-то незачем...
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
04.07.2010, 15:42  [ТС] 18
easybudda, Понятное дело) Но если еще не знаешь стл, а изучаешь все по порядку, то как же быть, кроме как городить велосипеды?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
04.07.2010, 15:52 19
Цитата Сообщение от Lavroff Посмотреть сообщение
Но если еще не знаешь стл
Не знаешь - так учи! http://www.cplusplus.com/reference/
На самом деле совсем не так сложно, как может на первый взгляд показаться. Главное вкурить основную концепцию использования этого счастья (контейнеры, итераторы, прочее...). Опять же много книжек есть хороших...
1
102 / 102 / 23
Регистрация: 12.05.2010
Сообщений: 232
04.07.2010, 16:37 20
по-моему проще разбивать строку strtok потом сравнивать с искомым словом без учета регистра stricmp
0
04.07.2010, 16:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2010, 16:37
Помогаю со студенческими работами здесь

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

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

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

Поиск повторяющихся слов в текстовом файле
подскажите есть вот такая задача В файле записаны различные слова через пробел. Нужно считать все...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru