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

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

Восстановить пароль Регистрация
 
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
12.03.2013, 00:23     Поиск слова в файле #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
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
 
int main ()
{
    setlocale (LC_ALL, "RUSSIAN");
    char word [512];
    cout << "Введите слово: ";
    cin >> word;
    //открыть файл для чтения
    //найти в файле такое же слово
    //если не нашли то
    FILE *file;
    file = fopen ("base.txt", "a+");
    fprintf (file,"%s \n", word);
    fclose (file);
    //если нашли то
    //записать в переменную
    //вывести переменную на экран
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xSCJx
22 / 19 / 1
Регистрация: 24.12.2012
Сообщений: 435
12.03.2013, 00:32     Поиск слова в файле #2
мне кроме как читать строку в стринг, и в нём искать подстроку на ум ничего не приходит (разве что можно ещё попробовать sstream).
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
12.03.2013, 03:33     Поиск слова в файле #3
Цитата Сообщение от Leningradeс Посмотреть сообщение
file = fopen ("base.txt", "a+");
Для этой цели достаточно вместо "a+" сделать "rb". (ведь нужно только прочитать, правильно?):
Вот вариант в стиле С, в стиле С++ всё было б гораздо проще:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
#define WORDSIZE 80
#define MAX 1000
 
int main()
{
    char file_in[WORDSIZE], word_file[MAX], word_find[WORDSIZE];
    char c;
    FILE* in = NULL;
    int i = 0;
 
    printf("Enter file name: ");
    scanf("%s", file_in);
 
    if ((in = fopen(file_in, "rb")) == NULL)
    {
        perror("Couldn't open file");
        exit(1);
    }
 
    printf("Word: ");
    scanf("%s", word_find);
 
    while((c = fgetc(in)) && !feof(in))
    {
        if (!isspace(c))
             word_file[i++] = c;
        else
        {
            word_file[i] = '\0';
            if (!strcmp(word_file, word_find))
            {
                printf("Fined '%s'\n", word_file);
                fclose(in);
                exit(0);
            }
            i = 0;
        }
    }
 
    printf("Not fined any '%s'\n", word_find);
 
    fclose(in);
 
    return 0;
}
Добавлено через 50 минут
в стиле с++:
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
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
 
int main()
{
    std::string file_in, word_in, word_fn;
 
    std::cout << "Input: ";
    std::cin >> file_in;
    
    std::ifstream in(file_in.c_str(), std::ios::in);
    if (!in.good())
    {
        std::clog << "Couldn't open file.\n";
        exit(1);
    }
 
    std::cout << "Enter word: ";
    std::cin >> word_fn;
 
    while (in >> word_in)
        if (word_in == word_fn)
        {
            std::cout << "Word '" << word_fn << "' fined.\n";
            in.close();
            return 0;
        }
    std::cout << "Not found\n";
    in.close();
 
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 09:51     Поиск слова в файле #4
xtorne21st, зачем в стиле С так сложно? Зачем там бинарный режим? И есть функция fscanf(), которая работает также, как и scanf(), только с файлами. Можно использовать её так же, как in >> word_in во вотором коде.
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
12.03.2013, 12:19  [ТС]     Поиск слова в файле #5
Стиль С++ удобнее показался, ну вот я поковырял его и теперь нужно добавить новое слово в файл.
И еще кодировка непонятная в string когда записываешь туда русское слово.

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
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
#include <stdio.h>
using namespace std;
 
int main ()
{
    setlocale (LC_ALL, "RUSSIAN");
    string file_in, word_in, word_fn;
    file_in = "base.txt";
    
    ifstream in (file_in.c_str (), ios::in);
    if (!in.good ())
    {
        clog << "Файл не найден.\n";
        exit (1);
    }
    cout << "Введите слово: ";
    cin >> word_fn;
    cout << word_fn;
    
    while (in >> word_in)
        if (word_in == word_fn)
        {
            cout << "Слово '" << word_fn << "' найдено.\n";
            in.close ();
            return 0;
        }
        if (word_in != word_fn)
        {
                        //добавить слово в конец файла
            cout << "Новое слово добавлено\n";
        }
    in.close ();
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 12:34     Поиск слова в файле #6
Цитата Сообщение от Leningradeс Посмотреть сообщение
И еще кодировка непонятная в string когда записываешь туда русское слово.
C++
1
2
3
4
5
6
7
8
#include <windows.h>
 
int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  ...
}
В свойствах консоли выбрать шрифт: Lucida Console
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
12.03.2013, 12:59  [ТС]     Поиск слова в файле #7
Поиск слова в файле
Все равно такая же проблема.
В этом примере я найденное совпадение из файла вывожу.
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
12.03.2013, 13:12  [ТС]     Поиск слова в файле #8
Вот код который ищет введенное пользователем слово и если не находит, то добавляет в конец файла.
Осталась проблема с кодировкой... из переменной string вылетают кракозябры...
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
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <fstream>
#include <string>
#include <stdio.h>
using namespace std;
 
int main ()
{
    setlocale (LC_ALL, "RUSSIAN");
    SetConsoleCP (866);
    SetConsoleOutputCP (866);
    string file_in, word_in, word_fn;
    file_in = "base.txt";
    
    ofstream out (file_in, ios::out | ios::app);
    ifstream in (file_in.c_str (), ios::in);
    if (!in.good ())
    {
        clog << "Файл не найден.\n";
        exit (1);
    }
    cout << "Введите слово: ";
    cin >> word_fn;
    
    while (in >> word_in)
        if (word_in == word_fn)
        {
            cout << "Слово '" << word_in << "' найдено.\n";
            system ("PAUSE");
            in.close ();
            return 0;
        }
        if (word_in != word_fn)
        {
            cout << "Слово '" << word_fn << "' не найдено\n";
            out << word_fn << "\n";
            cout << "Новое слово '" << word_fn << "' добавлено\n";
            system ("PAUSE");
            in.close ();
            return 0;
        }
    in.close ();
    return 0;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 13:20     Поиск слова в файле #9
Цитата Сообщение от Leningradeс Посмотреть сообщение
Все равно такая же проблема.
Среда какая?
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
12.03.2013, 13:42  [ТС]     Поиск слова в файле #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Среда какая?
Microsoft Visual Studio 2010
Файл сохранен с помощью AkelPad в кодировке 866 (OEM - русская).
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 13:53     Поиск слова в файле #11
Цитата Сообщение от Leningradeс Посмотреть сообщение
Файл сохранен с помощью AkelPad в кодировке 866 (OEM - русская).
И зачем это? Так нужно?

Добавлено через 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
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
int main()
{
    setlocale(0, ".1251"); //включили кодировку.
    //SetConsoleCP (1251); 
    //SetConsoleOutputCP (1251); // или так.
    
    char buff[500];
    wchar_t wbuff[500];
 
    ifstream f("upload.txt");
    
    f.getline(buff, 500); // в буффер char из файла UTF-8.
    
    MultiByteToWideChar(CP_UTF8, 0, buff, 500, wbuff, 500); //из буфера char в буфер wchar_t .
    wcout.imbue(locale("rus_rus.866")); //включаем другую кодировку.
    //setlocale(0, "rus_rus.866"); // или так.
    wcout << wbuff << endl; // выводим содержимое буфера wchar_t
    
    setlocale(0, ".1251"); // вернули кодировку.
    
    system("pause");
    return 0;
}
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
12.03.2013, 13:57  [ТС]     Поиск слова в файле #12
Цитата Сообщение от alsav22 Посмотреть сообщение
И зачем это? Так нужно?
Поиск слова в файле

Ну вот если файл сохранен в 1251 (ANSI - кириллица), то слово "арбуз" сохраняется в файле как кракозябра. Причем мой код считает что это не существующий "арбуз", а новое слово.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 13:59     Поиск слова в файле #13
Код покажите. Файл как делаете?
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
12.03.2013, 14:09  [ТС]     Поиск слова в файле #14
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
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <fstream>
#include <string>
#include <stdio.h>
using namespace std;
 
int main ()
{
    setlocale (0, ".1251");
    string file_in, word_in, word_fn;
    file_in = "base.txt";
    
    ofstream out (file_in, ios::out | ios::app);
    ifstream in (file_in.c_str (), ios::in);
    if (!in.good ())
    {
        clog << "Файл не найден.\n";
        exit (1);
    }
    cout << "Введите слово: ";
    cin >> word_fn;
    
    while (in >> word_in)
        if (word_in == word_fn)
        {
            cout << "Слово '" << word_in << "' найдено.\n";
            system ("PAUSE");
            in.close ();
            return 0;
        }
        if (word_in != word_fn)
        {
            cout << "Слово '" << word_fn << "' не найдено\n";
            out << word_fn << "\n";
            cout << "Новое слово '" << word_fn << "' добавлено\n";
            system ("PAUSE");
            in.close ();
            return 0;
        }
    in.close ();
    return 0;
}
Вообще если:
C++
1
setlocale (0, ".866");
То:
Поиск слова в файле

Если:
C++
1
setlocale (0, ".1251");
То:
Поиск слова в файле
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.03.2013, 14:21     Поиск слова в файле #15
Где это в коде? (6 пост)
C++
1
2
3
4
5
6
7
8
#include <windows.h>
 
int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  ...
}
Добавлено через 1 минуту
C++
1
setlocale (0, ".1251");
Только вывод по русски обеспечивает, а нужен и ввод.
Leningradeс
 Аватар для Leningradeс
10 / 10 / 1
Регистрация: 03.03.2011
Сообщений: 331
12.03.2013, 14:28  [ТС]     Поиск слова в файле #16
Цитата Сообщение от alsav22 Посмотреть сообщение
Где это в коде? (6 пост)
C++
1
2
3
4
5
6
7
8
#include <windows.h>
 
int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  ...
}
Добавлено через 1 минуту
C++
1
setlocale (0, ".1251");
Только вывод по русски обеспечивает, а нужен и ввод.
Все разобрался спасибо.
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
#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <fstream>
#include <string>
#include <stdio.h>
using namespace std;
 
int main ()
{
    setlocale (0, "1251");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string file_in, word_in, word_fn;
    file_in = "base.txt";
    
    ofstream out (file_in, ios::out | ios::app);
    ifstream in (file_in.c_str (), ios::in);
    if (!in.good ())
    {
        clog << "Файл не найден.\n";
        exit (1);
    }
    cout << "Введите слово: ";
    cin >> word_fn;
    
    while (in >> word_in)
        if (word_in == word_fn)
        {
            cout << "Слово '" << word_in << "' найдено.\n";
            system ("PAUSE");
            in.close ();
            return 0;
        }
        if (word_in != word_fn)
        {
            cout << "Слово '" << word_fn << "' не найдено\n";
            out << word_fn << "\n";
            cout << "Новое слово '" << word_fn << "' добавлено\n";
            system ("PAUSE");
            in.close ();
            return 0;
        }
    in.close ();
    return 0;
}
И файл сохранен в кодировке 1251. И теперь в файле и на экране русские буквы.
Просто привык в бате писать в 866, иначе он не читает русские буквы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2013, 16:19     Поиск слова в файле
Еще ссылки по теме:

C++ Поиск слова в файле
С++ поиск слова в файле C++
Поиск самого длинного слова в файле C++

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

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
12.03.2013, 16:19     Поиск слова в файле #17
Цитата Сообщение от alsav22 Посмотреть сообщение
xtorne21st, зачем в стиле С так сложно? Зачем там бинарный режим? И есть функция fscanf(), которая работает также, как и scanf(), только с файлами. Можно использовать её так же, как in >> word_in во вотором коде.
Да за fscanf() забыл...

Добавлено через 16 минут
Принимая во внимание рекомендации ув. alsav22, получаем код:
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define WORDSIZE 80
#define MAXSIZE 1000
 
int main(void)
{
    char file_in[WORDSIZE], word_need[WORDSIZE], word_file[MAXSIZE];
    FILE* in = NULL;
 
    printf("Input: ");
    scanf("%s", file_in);
 
    if ((in = fopen(file_in, "r")) == NULL)
    {
        perror("Couldn't open file");
        exit(1);
    }
 
    printf("Put word: ");
    scanf("%s", word_need);
 
    while (fscanf(in, "%s", word_file) && !feof(in))
        if (!strcmp(word_file, word_need))
        {
            printf("Word '%s' fined.\n", word_file);
            fclose(in);
            return 0;
        }
 
    printf("No found.\n");
    fclose(in);
 
    return 0;
}
Yandex
Объявления
12.03.2013, 16:19     Поиск слова в файле
Ответ Создать тему
Опции темы

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