Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: проблема с созданием файла с русскими буквами в названии  (Прочитано 9920 раз)
0 Пользователей и 1 Гость смотрят эту тему.
paxarpp
Гость
« : 29-04-2008 07:48 » 

день добрый!
столкнулся при написании своей простенькой проги, на с++(консоль), с проблемой:
в проге спрашивается имя тестируемого и сохраняется в файл, раньше файл имел жесткое имя, сейчас есть необходимость  сделать имя файла = имени при вводе. Так вот при вводе на англ. проблем нет , а при вводе на русском  вместо них сохраняются кракозябры.
Код:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include "Windows.h"
using namespace std;
void rus( char* _str )
{   
   int size;
   size=strlen(_str)+1;
   char *str=new char[size];
   CharToOemA( _str,str );
   cout<<str;
   delete []str;
}
int main ()
{
SetConsoleOutputCP(866);///////////////////////////////////////////////
HANDLE hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);//
    CONSOLE_SCREEN_BUFFER_INFO *ConsoleInfo = new CONSOLE_SCREEN_BUFFER_INFO();//
    GetConsoleScreenBufferInfo(hConsoleHandle, ConsoleInfo);//
    WORD OriginalColors = ConsoleInfo->wAttributes;//
    const int lineSize = 255;
    const int lineSize_small = 2;
int pr=0,nonpr=0,tit,otv;
char fio[lineSize],name[lineSize],lineotv[lineSize];
    int p=0,ball=0;
char otvch;
char stek[lineSize];

ifstream F;
ofstream G;
  F.open("D:\\abc4.txt");
  F.getline (name,lineSize);
SetConsoleTextAttribute(hConsoleHandle,FOREGROUND_GREEN);
rus(name);
cout<<"\n";
SetConsoleTextAttribute(hConsoleHandle, OriginalColors);
    rus("Введите ваше Имя и Фамилию: ");
cin.getline(fio,lineSize);
////////////////////////////
char name_vrem[lineSize];
char name_fale[lineSize+8];
for (p=0;(fio[p]!=0)&&(p<lineSize);p++)
{
name_vrem[p]=fio[p];
if (name_vrem[p]=' ')
{
name_vrem[p]='_';
}
}

name_vrem[p+5]=0;
name_vrem[p+4]='l';
name_vrem[p+3]='m';
name_vrem[p+2]='t';
name_vrem[p+1]='h';
name_vrem[p]='.';
name_fale[0]='D';
name_fale[1]=':';
name_fale[2]='\\';
for (p=0;name_vrem[p]!=0;p++)
{
name_fale[p+3]=name_vrem[p];
}
name_fale[p+3]=0;

for (p=0;name_fale[p]!=0;p++)
{
if (name_fale[p]>127)
{
name_fale[p]=name_fale[p]-20;
}
}

 ////////////////////////////
cout<<name_fale;
G.open(name_fale);///////      нужно как-то изменять русские буквы

    OemToCharA(fio,fio);
    G<<fio<<"<br>";

  SetConsoleTextAttribute(hConsoleHandle, OriginalColors);
  cout<<"PRESS ANY KEY TO END";
  F.close();
  G.close();
  cin>>p;
}
понимаю что код кривой , но мне пока так чтоб точно понять что где потом буду улучшать.

помогите подсказкой как быть с русскими буквами!
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 29-04-2008 08:09 » 

help chcp

dir c:\windows
chcp 1251|cd /d c:\windows |dir

и расскажи что получилось.

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
paxarpp
Гость
« Ответ #2 : 29-04-2008 20:01 » 

сори , но это первая моя прога и я не понял ,что нужно сделать.Если можно поподробнее?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 29-04-2008 20:10 » 

paxarpp, в консоли винды используется кодировка, отличная от остальной винды.
В русской локали в консоли используется cp866, а в винде - cp1251 и Unicode-16.
Соотв., после ввода с консоли и перед выводом на нее надо конвертировать строку.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
paxarpp
Гость
« Ответ #4 : 29-04-2008 20:12 » 

ага!
если ввести предложенное в командную строку винды , то листинг руских букв заменяется на русские, но другие(без смысла), английские не меняются
Записан
paxarpp
Гость
« Ответ #5 : 29-04-2008 20:14 » 

опять ага!
а как переконвертировать строку?
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 29-04-2008 20:24 » 

Смотри ф-ии OEMToAnsi и AnsiToOEM.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
paxarpp
Гость
« Ответ #7 : 30-04-2008 07:35 » new

Смотри ф-ии OEMToAnsi и AnsiToOEM.
смотрел и пробовал , но в примерах работа идет со строками типа string, и у меня не получается совместить мой код, использую массив char, со строками string. При компиляции вылазят ошибки. Может есть возможность перекодировать посимвольно в массиве char?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines