Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 06.05.2009
Сообщений: 7

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

30.05.2009, 23:30. Показов 1837. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.05.2009, 23:30
Ответы с готовыми решениями:

Проблема при работе с вводом/выводом в консоли
объясните пожалуйста, что здесь неправильного...Ввод просиходит только в а1 и б2, при этом в остальные переменные записывается непонятно...

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

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

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

воспользуйтесь поиском.. эта проблема неоднократно обсуждалась на форуме
0
692 / 383 / 51
Регистрация: 22.01.2009
Сообщений: 1,135
30.05.2009, 23:49
Попробуй CharToOem
0
 Аватар для kazak
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,304
31.05.2009, 13:51
Русские шрифты в консоли
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
31.05.2009, 14:06
Нужно создать отдельную тему с этим вопросом и закрепить.!
Действительно уже обсуждалось сто миллион раз
0
0 / 0 / 0
Регистрация: 06.05.2009
Сообщений: 7
31.05.2009, 17:41  [ТС]
а как быть с файловым вводом/выводом.
В какой кодировке надо сохранять входной файл чтобы корректно открывался и читался?

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

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

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

искомую строку ввожу установив
SetConsoleCP(866);
SetConsoleOutputCP(866);
в принципе норм.
есть одно но:
как входной/выходной файловые потоки заставить работать с 1251-кодировкой?
чтобы корректно открывались текстовые файлы с виндовой кодировкой.
буду благодарен любой подсказке.
0
Заказ софта
 Аватар для Search..
343 / 188 / 21
Регистрация: 26.05.2009
Сообщений: 863
31.05.2009, 17:45
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.05.2009, 17:45
Помогаю со студенческими работами здесь

Непонятка с Вводом-выводом
имеется такое дело static void Menu() { Console.WriteLine(&quot; 1 - Ввести список &quot;); ...

Ошибка с вводом/выводом
Qt компилирует, но в процессе исполнения программа закрывается с ошибкой. void main(void) { double num1=0.,num2=0.; char...

Подсобите со вводом/выводом
Здравствуйте! Крайняя ситуация, поэтому прошу помощь :( Необходимо вычислить сумму: z=\sum_{i=0}^{n}{y}_{i} , где ...

работа с вводом/выводом
Здравствуйте!!! Работаю с вводом/выводом и столкнулся со следующей проблемой: в программе вожу целочисленное значение с клавиатуры и затем...

Работаем с файловым вводом/выводом
Помогите пожалуйста решить две задачки. остальные сделал. 1)Дан текстовый файл. Напечатать все строки, длина которых равна заданному...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru