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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
lagun
0 / 0 / 0
Регистрация: 06.05.2009
Сообщений: 7
#1

Проблемы с вводом/выводом кирилицы в консоли - C++

30.05.2009, 23:30. Просмотров 1016. Ответов 6
Метки нет (Все метки)

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

даже при установке функции
setlocale(LC_CTYPE, ".1251"); или ".866"
wcout выводит некорректные символы.
как заставить программу корректно работать с русским языком.
Пробовал С++ билдеры 6.0 и 2009 отдно и тоже.
Помогите, буду очень благодарен.

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
#include <iostream>
#include <fstream>
#locale <locale>
using namespace std;
 
 
//вывод сообщения об ошибке
int error(char er[]);
//вывод результата поиска
int resultOut (char * pfileName, char * pst,int stPos,int * pcolspace );
//обход пробела в выходной строке
int Spa (char * pfileName, char * pst,int stPos,int * pcolspace );
//вставка
inline End (char * pfileName)
{   ofstream OutputFile;
    OutputFile.open(pfileName,ios::app);
    OutputFile << endl;
    OutputFile.close();
};
 
 
 
int main ()
{
/************************* ПЕРЕМЕННЫЕ **************************************************/
 
 
    int LenKey=0;           // Длинна искомой строки
 
    const keySize = 1000;
    char erin []= "input" ;
    char erout [] = "output" ;
    char  Key[keySize];     // Искомая строка
    char inFile[50];    // Имя входного файла
    char outFile[50];   //Имя выходного файла
    char  Str [200];    // Буфер для  строки
    int index;
    int LenStr;
    int endPos = 0;                 //позиция исходной
    int space = 0;
    int colspace = 0;
    int fin=0;
 
/************************* ВВОДИМЫЕ ЗНАЧЕНИЯ ******************************************/
go: cout << "Enter input file name: ";
    cin.getline(inFile,50);             // Вводим имя файла
    cout << endl;
    cout << "Enter output file name: ";
    cin.getline(outFile,50);                // Вводим имя файла
    cout << endl;
    //cin.get();
    cout << "Enter find text: ";
    cin.getline(Key,keySize);           // Вводим то, что ищем
 
/******************** ПОЛУЧЕНИЕ СТРОКИ ИЗ ФАЙЛА *******************************/
    ofstream OutputFile;            // Открываем выходной файл
    OutputFile.open(outFile,ios::out);
    if (OutputFile.is_open()!= true)   //если файл не открылся
        {
            if (error(erout) == 1)       //запустить функцию
                goto go;
            return 2;
        }
    OutputFile.close();             //закрыть файл
 
 
 
    ifstream InputFile(inFile); // Открываем входной файл
 
    while (! InputFile.eof())       // Читаем строки пока не закончился файл
    {
        if (InputFile.fail())       // Если файл не открыватся, тогда ошибка
            {
                if (error(erin) == 1)       //запустить функцию
                    goto go;
                return 1;
            }
        else
 
        InputFile.getline (Str, 200);   // Получаем символы
    //  Str = CharBuf;                                  // Запихиваем символы в строку
 
 
 
/************************* ПОИСК **********************************************/
        LenKey = strlen(Key);
        LenStr = strlen(Str);
        endPos = 0;                //позиция исходной
        space = 0;
        colspace = 0;
        fin=0;
        index = 0;
 
        while (LenKey > fin)
        {
            if (Key[fin] == ' ' )
                 colspace++;
            if (Key[fin] == '*' || Key[fin] == '?')
                 index++;
 
            fin++;
 
        }
//если искомая строка состоит только из ? и * то вывести содержимое входного файла
        if (index == LenKey )
        {
            OutputFile.open(outFile,ios::app);
            while (Str[endPos]!='\0')
                    OutputFile << Str[endPos++];
            OutputFile.close();
        }
        //if (LenKey == 1 && Key[0]== '?')
 
restart:while (endPos < LenStr)
        {
            if (Str[endPos]==' ') space = endPos+1; //первый пробел
            fin = 0;
            while((Key[fin]!='\0')&& (Key[fin] == Str[endPos] || Key[fin] == '*' || Key[fin] == '?'))
            {
                //==============любой символ====================================
                if (Key[fin] == '?')
                    if (fin == (LenKey-1))
                        {
                            do
                            {
                                    space = resultOut(outFile,Str,space,&colspace);
                            } while(Str[space]!= ' ' && space < LenStr);
                         endPos = space++;
                         End (outFile);
                         goto restart;
                        }
                //===========любое количество любых символов====================
                if (Key[fin] == '*')
                {
                    if (fin >= (LenKey-1))
                        {
                        OutputFile.open(outFile,ios::app);
                            do
                            {
 
                                OutputFile << Str[space];
 
                            } while(Str[++space]!='\0');
                        OutputFile.close();
                        End (outFile);
                        endPos = space;
                        goto restart;
 
                        }
                    endPos++;
                    do
                    {
                        fin++;
                    }while(Key[fin] == '?' || Key[fin] == '*');
 
 
 
                    if (fin > (LenKey-1))
                        {
                        OutputFile.open(outFile,ios::app);
                            do
                            {
 
                                OutputFile << Str[space];
 
                            } while(Str[++space]!='\0');
                        OutputFile.close();
                        End (outFile);
                        endPos = space;
                        goto restart;
 
                        }
                    while(Key[fin]!=Str[endPos] && endPos < LenStr)
                            endPos++;
                }
                //============================================================
                if (Key[fin] == Str[endPos])
                    if (fin == (LenKey-1))
                        {
                            do
                            {//вывод результата поиска
                                space = resultOut(outFile,Str,space,&colspace);
 
                            } while((Str[space]!= ' ' || endPos > space) && space < LenStr );
                        endPos = space ;
                        space++;
                        End (outFile);
                        goto restart;              //
                        }
                     else if (endPos == (LenStr-1))  //входная строка закончилась
                                goto start;          //перейти на старт
 
                fin++;
                if  (endPos < LenStr-1)
                        { endPos++; }
                    else goto start;
            }
start:  endPos++;
 
        }
     }
 
    cout << "Press enter to exit program";
 
    cin.get();
    return 0;
}
 
 
//вывод сообщения об ошибке
int error(char er[])
{
    cout << endl << endl;
    cerr << "*********** Error open " << er << " file ***********" << endl;
    cout << endl;
    cout << "Press <1> to retry or <any key> to exit ";
    char ch;
    cin.get(ch);
    cin.get();
    if (ch == '1')
         {return 1;}
    else return 2;
}
 
//вывод результата поиска
int resultOut (char * pfileName, char * pst,int stPos,int * pcolspace )
{
    ofstream OutputFile;            // Открываем файл
    OutputFile.open(pfileName,ios::app);
    OutputFile << pst[stPos];
    OutputFile.close();
    stPos++;
    if (pcolspace > 0)
    {
        stPos = Spa( pfileName, pst, stPos, pcolspace);
    }
    return stPos;
}
 
 
//удаление пробелов
int Spa (char * pfileName, char * pst,int stPos,int * pcolspace )
{
 
    if ((*pcolspace > 0) && (pst[stPos] == ' ') )
    {
        ofstream OutputFile;            // Открываем файл
        OutputFile.open(pfileName,ios::app);
        OutputFile << pst[stPos];
        OutputFile.close();
        stPos++;
        *pcolspace = *pcolspace - 1;
        stPos = Spa(pfileName, pst,stPos,pcolspace);
        return stPos;
    }
    else  return stPos;
 
}


ps. не судите строго, я только начитаю учить с++

pps. подскажите, пожалуйста как можно передовать файловый поток выводы в другую процедуру.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.05.2009, 23:30     Проблемы с вводом/выводом кирилицы в консоли
Посмотрите здесь:

Помогите разобраться с потоковым вводом/выводом в С++ C++
Проблема с вводом-выводом из файлов C++
C++ Помощь с потоковым вводом-выводом.
Значения флагов-манипуляторов управления вводом/выводом. C++
C++ не могу разобраться с вводом и выводом данных
Проблемы с выводом C++
Обработка одномерных массивов с файловым вводом выводом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
2786 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.05.2009, 23:40     Проблемы с вводом/выводом кирилицы в консоли #2
Цитата Сообщение от lagun Посмотреть сообщение
setlocale(LC_CTYPE, ".1251");
эта функция работает не на всех компиляторах...

воспользуйтесь поиском.. эта проблема неоднократно обсуждалась на форуме
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
30.05.2009, 23:49     Проблемы с вводом/выводом кирилицы в консоли #3
Попробуй CharToOem
kazak
3031 / 2352 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
31.05.2009, 13:51     Проблемы с вводом/выводом кирилицы в консоли #4
Русские шрифты в консоли
ISergey
Maniac
Эксперт С++
1346 / 879 / 51
Регистрация: 02.01.2009
Сообщений: 2,643
Записей в блоге: 1
31.05.2009, 14:06     Проблемы с вводом/выводом кирилицы в консоли #5
Нужно создать отдельную тему с этим вопросом и закрепить.!
Действительно уже обсуждалось сто миллион раз
lagun
0 / 0 / 0
Регистрация: 06.05.2009
Сообщений: 7
31.05.2009, 17:41  [ТС]     Проблемы с вводом/выводом кирилицы в консоли #6
а как быть с файловым вводом/выводом.
В какой кодировке надо сохранять входной файл чтобы корректно открывался и читался?

Добавлено через 14 минут 35 секунд
я добавлял #include <windows>
и
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
и , еще шрифт в консоли - Lucida Console
тогда намана работает ввод/вывод.
А как быть с файловым вводом/выводом?
В какой кодировке надо сохранять входной файл, и как правильно открывать чтобы корректно читался?
файлы с русским текстом даже не открываются.
насколько я понял, пытаясь решить этот вопрос, повсеместная лажа с консольным вводом/выводом это недостаток самой консоли(кодировки а которой она работает) .

Добавлено через 2 часа 17 минут 36 секунд
с файлами с досовой кодировки работает ок
ввожу имена входного и выходного файлов установив

SetConsoleCP(1251);
SetConsoleOutputCP(1251);//т.к. имена файлов в видовые

искомую строку ввожу установив
SetConsoleCP(866);
SetConsoleOutputCP(866);
в принципе норм.
есть одно но:
как входной/выходной файловые потоки заставить работать с 1251-кодировкой?
чтобы корректно открывались текстовые файлы с виндовой кодировкой.
буду благодарен любой подсказке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2009, 17:45     Проблемы с вводом/выводом кирилицы в консоли
Еще ссылки по теме:

У кого нибудь есть приложение Win32 на c++! Примеры программ, с вводом и выводом данных! чтобы нагляднее было! C++
C++ Трабл с вводом/выводом
Заменить консольный ввод-вывод файловым вводом выводом C++
Операции с матрицой и работа с вводом-выводом в файл C++
Найти и исправить ошибки в коде (проблемы с вводом) C++

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

Или воспользуйтесь поиском по форуму:
Search..
Заказ софта
340 / 185 / 10
Регистрация: 26.05.2009
Сообщений: 863
31.05.2009, 17:45     Проблемы с вводом/выводом кирилицы в консоли #7
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <locale.h>
 
int main(int argc ,char * argv [])
{
    setlocale(LC_ALL,"Rus");
 
    printf("Афтар, выпей яду!\n");
 
    return 0;
}
Yandex
Объявления
31.05.2009, 17:45     Проблемы с вводом/выводом кирилицы в консоли
Ответ Создать тему
Опции темы

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