Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как прео тип string в char без потери русских букв


Автор: vladd 6.6.2012, 09:53
Здравствуйте!
У меня Borland C++ Bulder Enterprise Suite Version 6.0(Build 10.155) 
Имею структуру. Нужно с консоли её заполнить на русском языке так, чтобы при обратном выводе русские буквы не превратились в кракозябры. Для этого для считывания с консоли использую код
Код

 string sStr1;
  
  cout << "Введите ФИО больного: ";
            getline(cin, sStr1);

             strcpy(pacien.Bolnoy,sStr1);// заполнение структуры

pacien - структура
pacien.Bolnoy - элемент структуры
 

На строку 
Код

  strcpy(pacien.Bolnoy,sStr1);// заполнение структуры

ругается.
Код

E2034 Cannot convert 'string' to 'const char *'


Что нужно сделать, чтобы заполнить структуру, оно не ругалось и при выводе сохранились русские буквы.

Автор: artsb 6.6.2012, 09:59
Код

strcpy(pacien.Bolnoy,sStr1.c_str());

Автор: vladd 6.6.2012, 10:16
Спасибо, но русских букв уже нет.

user posted image

Функция копирования исказила их. 

Автор: artsb 6.6.2012, 10:32
Как выглядит ваша структура?

Добавлено через 40 секунд
И почему вы не пользуетесь WideChar?

Автор: vladd 6.6.2012, 10:35
Вопрос считаю решенным. Остается узнать как правильно заполнить структуру без потери русских букв. 
Вопрос к модератору.
Мне надо открыть новую тему или же можно здесь продолжить?

Добавлено через 2 минуты и 13 секунд
Моя структура
Код

struct Pacient {
//string Bolnoy [10]; // ФИО пациента
  char Bolnoy [10];
  char Doctor [10]; // ФИО врача
  int Age;         // Возвраст
  char Diagnoz [10];    // Диагноз
  char Otdelenie [10];  // Отделение

  Pacient *prev;       // Указатель на предыдущую запись
  Pacient *next;       // Указатель на последующую запись
};

Автор: artsb 6.6.2012, 11:15
vladd, используйте юникод:
user posted image
Код

struct Pacient {
    wchar_t Bolnoy [10];
    wchar_t Doctor [10]; // ФИО врача
    int Age;         // Возвраст
    wchar_t Diagnoz [10];    // Диагноз
    wchar_t Otdelenie [10];  // Отделение
    Pacient *prev;       // Указатель на предыдущую запись
    Pacient *next;       // Указатель на последующую запись
};

int _tmain(int argc, _TCHAR* argv[])
{
    Pacient Pac;
    Pacient *p = &Pac;

    setlocale(LC_ALL, "");

    std::wcout << L"Введите ФИО больного: ";
    std::wcin >> p->Bolnoy;
    std::wcout << std::endl;
    std::wcout << L"Вы ввели: " << p->Bolnoy << std::endl;

    system("pause");

    return 0;
}

Автор: vladd 6.6.2012, 11:31
Не работает этот код у меня.
Код

#include <clx.h>
#include <conio.h>
#include <iostream.h>
#include <conio.h>
#include <clx.h>
#include <fstream.h>
#include <iomanip.h>
  #include <windows.h>
   #include <string>
   #include <locale>
   #pragma hdrstop
#include <stdio.h>
using namespace System;
 using namespace std;
   struct Pacient {
    wchar_t Bolnoy [10];
    wchar_t Doctor [10]; // ФИО врача
    int Age;         // Возвраст
    wchar_t Diagnoz [10];    // Диагноз
    wchar_t Otdelenie [10];  // Отделение
    Pacient *prev;       // Указатель на предыдущую запись
    Pacient *next;       // Указатель на последующую запись
};
int _tmain(int argc, _TCHAR* argv[])
{
    Pacient Pac;
    Pacient *p = &Pac;
    setlocale(LC_ALL, "");
    std::wcout << L"Введите ФИО больного: ";
    std::wcin >> p->Bolnoy;
    std::wcout << std::endl;
    std::wcout << L"Вы ввели: " << p->Bolnoy << std::endl;
    system("pause");
    return 0;
}

user posted image

Автор: artsb 6.6.2012, 12:49
Аномалия какая-та. Не может же программа взять и пропустить половину строк. Не записав при этом никаких ошибок...

Автор: vladd 6.6.2012, 13:02
По моему программа на них вообще не реагирует. Буква w, когда первая в слове, запрещает реагировать на функции. Видимо что то связано с Windows.

Добавлено через 2 минуты и 52 секунды
Если я комментирую библиотеки тогда появляются ошибки. 

Автор: artsb 6.6.2012, 13:36
Цитата(vladd @  6.6.2012,  13:02 Найти цитируемый пост)
Буква w, когда первая в слове, запрещает реагировать на функции. Видимо что то связано с Windows.

Неа. Буква w и Винда тут не причём.

Цитата(vladd @  6.6.2012,  13:02 Найти цитируемый пост)
Если я комментирую библиотеки тогда появляются ошибки.  

Ну это понятно.

Попробуй в дебагере пройтись по шагам и посмотри что будет.
И выложи этот неработающий проект на каком-нибудь файлообменнике.

Автор: vladd 6.6.2012, 14:26
Вот на форуме попробую

Автор: artsb 6.6.2012, 15:02
У меня работает. Правда без CLX. Зачем вы вообще подключаете clx.h?

Автор: vladd 6.6.2012, 15:10
Закоментировал #include <clx.h>. Все то же самое. Сейчас попробую закачать другой с++ builder 6. Может в самой программе какие глюки.

Автор: artsb 6.6.2012, 16:14
- Попробуйте создать проект заного. Убедитесь, что всякие там галочки типа "CLX" сняты.
- Попробуйте установить все доступные патчи для BCB6.
- Попробуйте воспользоваться более свежей версией C++Builder.

Автор: vladd 7.6.2012, 08:37
Все переустановил.Создал проект заново. А где брать эти патчи для BCB 6?
Всё то же самое. Может проблема в Windows? У меня стоит XP 3.

Автор: artsb 7.6.2012, 09:13
Цитата(vladd @  7.6.2012,  08:37 Найти цитируемый пост)
А где брать эти патчи для BCB 6?

Например, http://club.shelek.ru/download.php?id=357.

Цитата(vladd @  7.6.2012,  08:37 Найти цитируемый пост)
Всё то же самое. Может проблема в Windows? У меня стоит XP 3. 

Сильно сомневаюсь, но давайте проверим. Соберите полностью релизный проект и выложите на файлообменнике или здесь. Проверю у себя на семёрке.

Автор: vladd 7.6.2012, 09:49
Добавил патч.Изменений нет. 

Автор: vladd 7.6.2012, 10:14
А как писать программу в UNICODE? Где об этом можно почитать?

Автор: artsb 7.6.2012, 11:16
vladd, я просил готовый собранный релизный EXE'шник smile

Цитата(vladd @  7.6.2012,  10:14 Найти цитируемый пост)
А как писать программу в UNICODE? Где об этом можно почитать? 

Просто используй тип wchar_t вместо char. В VCL WideString вместо AnsiString. И выставить соответствующую настройку в опциях проекта.
А ещё можно писать универсальный проект:
1. подключить tchar.h
2. вместо wchar_t и char использовать _TCHAR
3. вместо WideString и AnsiString использовать String
4. строки оборачивать в дефайн _T(), т.е. например, _T("hello world"); или символ - _T('1')
5. использовать дефайны из tchar.h вместо самих функций. Т.е. вместо strlen() и wcslen(), использовать _tcslen() и т.д.
В этом случае, компилятор сам разберётся какой тип использовать в зависимости от настроек проекта.

Читать про всё это в Интернете smile

Автор: vladd 7.6.2012, 11:30
А как создать этот собранный релизный EXE'шник в C++ Bulder 6? Честное слово первый раз сталкиваюсь.
Это скомпилированная программа?


Автор: artsb 7.6.2012, 11:57
Цитата(vladd @  7.6.2012,  11:30 Найти цитируемый пост)
Это скомпилированная программа?

Ага. Только не забудь снять галочки
Цитата

    Project->Options->Linker->Use dynamic RTL
    Project->Options->Packages->Build with runtime packages

Автор: vladd 7.6.2012, 12:02
Сделал по этому совету.

Хочу, чтобы моя программа работала на другом компьютере, где не установлен C++Builder.
Как сделать, чтобы пpогpамма на C++Builder 3,4,5,6 и т.д. не требовала .bpl, .dll ?

В Project|Options|Packages снять галку с Build with runtime packages,
   Project|Options|Linker снять галку с Use dynamic RTL.

Что то никак exe файл получить не могу.

Автор: artsb 7.6.2012, 12:36
Цитата(vladd @  7.6.2012,  12:02 Найти цитируемый пост)
Что то никак exe файл получить не могу.

В каком смысле не можешь? Сделай Project->Build. В папке с проектом появится exe-файл.

Автор: vladd 7.6.2012, 12:39
Нашел еще вот 
http://www.ithowto.ru/264-nastrojka-kompilyatora-v-c-builder.html
Теперь релиз после этого.

Автор: vladd 7.6.2012, 15:13
Новая задача. После создания релизный EXE'шника, перестал работать С++Bulder 6. Не могу запустить программу даже на Hello Word. Пишет

[Linker Error] Unresolved external '_main' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0X32.OBJ. 

Что делать? Кто Нибудь может помочь.  

Автор: artsb 7.6.2012, 15:45
Цитата(vladd @  7.6.2012,  12:39 Найти цитируемый пост)
Нашел еще вот 
http://www.ithowto.ru/264-nastrojka-kompil...-c-builder.html
Теперь релиз после этого. 

Ну да. Но у тебя же BCB6. Там малость по-другому.

У меня твоя программа тоже сразу просит нажать любую клавишу.
Попробую дома установить BCB6 и проверить. Правда, у меня дома семёрка, так что эксперимент будет не совсем "чистый".


Цитата(vladd @  7.6.2012,  15:13 Найти цитируемый пост)
Новая задача. После создания релизный EXE'шника, перестал работать С++Bulder 6. Не могу запустить программу даже на Hello Word. Пишет

[Linker Error] Unresolved external '_main' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0X32.OBJ. 

Что-то ты там накрутил smile Линковщик говорит, что не может найти реализацию для функции _main()

Автор: vladd 7.6.2012, 15:50
Спасибо. Последний вопрос решился сам по себе. С++ Bulder завис. Перегрузил компьютер. И вроде снова стал видеть main.  

Автор: artsb 8.6.2012, 00:07
Вот что выяснилось:
BCB6 не поддерживает Юникод. А то что есть, это только задатки Юникода smile

Почитай http://forum.oszone.net/thread-129824-6.html как писать по-русски в консоли.

Автор: vladd 8.6.2012, 07:25
Спасибо большое за помощь. Но вопрос был, сейчас подкорректирую. Как заполнить структуру элементами на русском языке, чтобы при выводе в консоль тоже были русские буквы. Повторюсь. Для вывода русских букв в консоль я использую код
Код

//Руссификация
   ostream& operator<<(ostream &stream,char* s){
        for(char* ps=s; *ps; ps++){
                if(*ps=='ё')
                        stream<<char(241);
                else if(*ps=='Ё')
                        stream<<char(240);
                else if(*ps>=-64 && *ps<=-17)
                        stream<<char(*ps+64+128);
                else if(*ps<0)
                        stream<<char(*ps+64+176);
                else
                        stream<<*ps;
        }
        return stream;
}
 

Для чтения русских букв с консоли я использую код
Код

string str1;
cout << "Введите строку: ";
getline(cin, str1);


str1 уже содержит слово русскими буквами. Но необходимо присвоить элементам структуры значение str1 без искажения русских букв.
Пробовал 
Код

 cin >> pacient->Bolnoy;


и так

Код

strcpy(pacien.Bolnoy,sStr1.c_str());


Не получается. Русские буквы  искажаются в первом случае функцией cin >>. Во втором случае функцией strcpy.
Вопрос. Как заполнить структуру элементами на русском языке, чтобы при выводе в консоль тоже были русские буквы?
Прошу извинить за то что повторяюсь.

Автор: artsb 8.6.2012, 11:08
Посмотри в сторону функций:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms647473%28v=vs.85%29.aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms647493%28v=vs.85%29.aspx

ЗЫ а писать на BCB6 принципиально или можно перейти на более свежую версию?

Автор: vladd 8.6.2012, 12:05
Обязательно на Borland или Dev.

Автор: artsb 8.6.2012, 12:41
Цитата(vladd @  8.6.2012,  12:05 Найти цитируемый пост)
Обязательно на Borland или Dev. 

Так поставь C++Builder 2009 или старше, и используй Юникод.

Автор: vladd 8.6.2012, 13:54
Спасибо за помощь. Но в техникуме стоит BCB 6. Поэтому придется делать на BCB 6.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)