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

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

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

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

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

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

Трабл с вводом/выводом - C++
Вот есть код: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main(){ setlocale(0,&quot;&quot;); char a; ifstream...

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

Помощь с потоковым вводом-выводом. - C++
Доброго времени суток. можно ли как-нибудь создать/открыть файл для чтения и добавления с помощью ofstream ? Или только с fopen?

Помогите разобраться с потоковым вводом/выводом в С++ - C++
как решить эти две задачи: 24.1 Для класса Т1, имеющего два целочисленных компонентных данных а и b с частным типом доступа, должна быть...

не могу разобраться с вводом и выводом данных - C++
1. как считать из файла input считать массив (и как его правильно там записать) 2. как правильно подать на запись в файл output то, что...

6
Monte-Cristo
2790 / 1376 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.05.2009, 23:40 #2
Цитата Сообщение от lagun Посмотреть сообщение
setlocale(LC_CTYPE, ".1251");
эта функция работает не на всех компиляторах...

воспользуйтесь поиском.. эта проблема неоднократно обсуждалась на форуме
0
FunDuck
688 / 379 / 4
Регистрация: 22.01.2009
Сообщений: 1,135
30.05.2009, 23:49 #3
Попробуй CharToOem
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,436
Завершенные тесты: 1
31.05.2009, 13:51 #4
Русские шрифты в консоли
0
ISergey
Maniac
Эксперт С++
1395 / 906 / 56
Регистрация: 02.01.2009
Сообщений: 2,706
Записей в блоге: 1
31.05.2009, 14:06 #5
Нужно создать отдельную тему с этим вопросом и закрепить.!
Действительно уже обсуждалось сто миллион раз
0
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-кодировкой?
чтобы корректно открывались текстовые файлы с виндовой кодировкой.
буду благодарен любой подсказке.
0
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;
}
0
31.05.2009, 17:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.05.2009, 17:45
Привет! Вот еще темы с ответами:

Операции с матрицой и работа с вводом-выводом в файл - C++
Здравствуйте. Дали несколько заданий на практике, одно из них следующее: Начиная с центра, обойти по спирали все элементы квадратной...

Обработка одномерных массивов с файловым вводом выводом - C++
дан массив размера N и целые числа K и L (1&lt;=K&lt;=L&lt;=N). Найти сумму элементов массива с номерами от K до L включительно. фишка в том чтобы...

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

Заменить консольный ввод-вывод файловым вводом выводом - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; struct Address { string Index; string Country; string...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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