Проблема с чтением символов кирилицы из файла

Представим, что есть файл, где написана какая-то инф-ция.( например «mother — мама»).
Я хочу реализовать поиск по файлу, и если искомая подстрока нашлась в строке, которую программа считала из файла, то вывести эту строку. Вот мой код:

#include <iostream>
#include <fstream>
#include <string.h>
#include <windows.h>

using namespace std;
void null ( char *str, int i )
{
    for ( int h = 0; h < i; h++ )
    {
        *str++ = 0;
    }
}


bool str_in_str ( char *str_found, char *str_begin )
{
    char buff[100];
    int temp;
    for ( int i = 0; i < strlen(str_begin); i++ )
    {
        temp = 0;
        if ( i + strlen(str_found) > strlen(str_begin) ) break;
        for ( int j = i; j < i + strlen(str_found); j++ )
        {
            buff[temp] = str_begin[j];
            temp++;
        }
        if ( strcmp ( buff, str_found ) == 0 ) return true;
        null ( buff, 100 );
    }
    return false;
}

int main( int argv, char *argc[] )
{
    setlocale ( 0, "Russian" );
    ifstream data_base( "data_base.dat", ios::in );
    if ( data_base.is_open() )
    {
        char word[100];
        char buff[100];
        char buff2[100];
        char buff3[100];
        bool yes = false;
        while ( 1 )
        {
            cout << "введите искомое слово:";
            cin.get(word,100); cin.ignore();
            OemToCharBuff ( word, buff, 100 );
            if ( strcmp ( buff, ".выход" ) == 0 ) break;
            while ( data_base.getline(buff2, 100) )
            {
                OemToCharBuff ( buff2, buff3, 100 );
                if ( str_in_str ( buff, buff3 ) )
                {
                    cout << buff3 << endl;
                    null(word,100);null(buff,100);null(buff2,100);null(buff3,100);
                    yes = true;
                    break;
                }
            }
            if ( !yes ) cout << "Не найдено!" << endl;
            yes = false;
        }
        data_base.close();
    }
    return 0;
}


проблема в том, что при показе строки, ( ввели mother ) показывает mother - ьрьр.
А если искомая подстрока написана по русски, то даже если она есть в файле, программа ничего не находит.
В чём дело?

У тебя в файле данных кириллица в какой кодировке? Подозреваю, что windows-1251. Тогда при чтении из этого файла вызов функции перекодировки OemToCharBuff ( buff2, buff3, 100 ); — лишний. Посмотри под отладчиком перед поиском подстроки в каких кодировках в буферах содержаться данные (кириллица, разумеется).

Кроме того, (на первый взгляд) можно сказать, что

  1. Для поиска подстроки в строке (C-style) есть библиотечная функция strstr().
  2. Для каждого нового поиска надо перемещать указатель файла на начало функцией seekg(). Иначе поиск следующей строки будет производиться только в непрочитанном хвосте файла (с легко прогнозируемым результатом).
  3. Библиотечный аналог функции null() (кстати, опасное название!) — memset().

OemToCharBuff ( buff2, buff3, 100 ); — лишний

без него вообще ничего не находит

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

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.