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

опять о шрифтах - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.77
interesno2111
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 5
02.07.2010, 20:20     опять о шрифтах #1
приветствую. Имеется программа из учебника:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <clocale>;
using namespace std;
int main() {
    setlocale(LC_ALL, "Russian");
    double fahr, cels;
    cout << endl << "ВВедите температуру по Фаренгейту" << endl;
    cin >> fahr;
    cels=5/9*(fahr-32);
    cout << "По Фаренгейту: " << fahr << "По Цельсию: " << cels <<endl;
    return 0;
}
Однако, после выполнения результат - квазябра, типа иероглифы.
Что сделано неправильно? я вот - не знаю.
Может кто в курсе? Сообщите, если не лень.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2010, 20:20     опять о шрифтах
Посмотрите здесь:

опять строки C++
C++ Опять интегралы....
C++ матрица опять (
Опять текстуры C++
Опять static C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
02.07.2010, 20:30     опять о шрифтах #2
На Dev-C++ сетлокал не работает, используйте другие способы, например CharToOem
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
02.07.2010, 20:47     опять о шрифтах #3
M128K145, CharToOem требует *char, а если мне надо string перевести?

Добавлено через 1 минуту
нужно заводить отдельную переменную и в в нее переводить?
C++
1
2
3
string str;
char *res=str.c_str();
CharToOem(res,res);
так?
interesno2111
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 5
02.07.2010, 20:51  [ТС]     опять о шрифтах #4
Цитата Сообщение от M128K145 Посмотреть сообщение
На Dev-C++ сетлокал не работает, используйте другие способы, например CharToOem
А чем можно пользоваться чтобы сетлокол работал? (про CharToOem - спасибо)
besstiaa
 Аватар для besstiaa
93 / 93 / 7
Регистрация: 04.06.2010
Сообщений: 223
02.07.2010, 20:58     опять о шрифтах #5
Цитата Сообщение от interesno2111 Посмотреть сообщение
А чем можно пользоваться чтобы сетлокол работал? (про CharToOem - спасибо)
Visual Studio
interesno2111
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 5
02.07.2010, 21:08  [ТС]     опять о шрифтах #6
И все?
Mog
0 / 0 / 1
Регистрация: 18.01.2010
Сообщений: 14
02.07.2010, 21:15     опять о шрифтах #7
Цитата Сообщение от besstiaa Посмотреть сообщение
Visual Studio
Там тоже у меня не пашет, или я что-то не так делаю?)
besstiaa
 Аватар для besstiaa
93 / 93 / 7
Регистрация: 04.06.2010
Сообщений: 223
02.07.2010, 21:23     опять о шрифтах #8
Цитата Сообщение от Mog Посмотреть сообщение
Там тоже у меня не пашет, или я что-то не так делаю?)
Всё работает. VS 2008
interesno2111
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 5
02.07.2010, 22:10  [ТС]     опять о шрифтах #9
Цитата Сообщение от PointsEqual Посмотреть сообщение
M128K145, CharToOem требует *char, а если мне надо string перевести?

Добавлено через 1 минуту
нужно заводить отдельную переменную и в в нее переводить?
C++
1
2
3
string str;
char *res=str.c_str();
CharToOem(res,res);
так?
.

т.е. строковые литералы заводить как переменную?
а если их в программе много?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.07.2010, 22:40     опять о шрифтах #10
Цитата Сообщение от PointsEqual Посмотреть сообщение
CharToOem(res,res);
так в принципе работать не будет - std::string::c_str() возвращает указатель на константную строку.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
02.07.2010, 22:49     опять о шрифтах #11
извиняюсь, вот так работает

C++
1
2
3
4
string str="абвгд";
char *res;
CharToOem(str.c_str(),res);
cout<<res;
но вопрос вот в чем - чтобы перевести string нужно создавать дополнительную переменную(res)? а без нее нельзя никак?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
02.07.2010, 22:55     опять о шрифтах #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include "cp866.h"
 
int main()
{
   std::locale rus(std::locale(), new cp866()); // 1
   std::ios_base::sync_with_stdio(false);       // 2
   
   std::cout.imbue(rus);                        // 3
 
   std::string str = "абвгд";
   std::cout << str << std::endl;
 
   return 0;
}
1. Где-то прочитал, что в большинстве реализаций не существует, как таковых нестандартных локал-объектов (кроме POSIX-locale), так что в качестве выхода необходимо применить свою реализацию. Примерную реализацию можно посмотреть здесь
cpp866.h
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
#pragma once
 
#include <windows.h>
 
class cp866 : public std::codecvt <char, char, std::mbstate_t> {
public:
   explicit cp866 ( size_t r = 0 ) : std::codecvt <char, char, std::mbstate_t> ( r ) {}
 
protected:
   result do_in ( state_type&, const char* from, const char* from_end, const char*& from_next, char* to, char*, char*& to_next ) const {
      const int size = from_end - from;
      ::OemToCharBuff ( from, to, size );
 
      from_next = from + size;
      to_next = to + size ;
 
      return ok;
   }
 
   result do_out ( state_type&, const char* from, const char* from_end, const char*& from_next, char* to, char*, char*& to_next ) const {
      const int size = from_end - from;
      ::CharToOemBuff ( from, to, size );
 
      from_next = from + size;
      to_next = to + size ;
 
      return ok;
   }
 
   result do_unshift ( state_type&, char*, char*, char*& ) const { return ok; }
   int do_encoding () const throw () { return 1; }
   bool do_always_noconv () const throw () { return false; }
 
   int do_length ( state_type& state, const char* from, const char* from_end, size_t max ) const {
      return std::codecvt <char, char, std::mbstate_t>::do_length ( state, from, from_end, max );
   }
 
   int do_max_length () const throw () {
      return std::codecvt <char, char, std::mbstate_t>::do_max_length ();
   }
};

2. Выключение синхронизации locale с stdio. В принципе у меня локаль работает и без этой строки, но все может быть.
3. Установка связки "локаль-поток", понятное дело что связывать надо только нужные потоки.

вроде бы все. способ чудесно работает для всех видов ввода и вывода
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
02.07.2010, 22:58     опять о шрифтах #13
Цитата Сообщение от fasked Посмотреть сообщение
#include "cp866.h"
у меня не находит такой, аа вон он) увидел
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
02.07.2010, 23:01     опять о шрифтах #14
Цитата Сообщение от PointsEqual Посмотреть сообщение
у меня не находит такой, аа вон он) увидел
да-да, содержимое находится под катом, в заголовке лежит класс локали, который для красоты главного файла был туда и спрятан собственно
кстати, реализация опять же под windows, потому что использовать самописанные chartooem и oemtochar не хочется, к тому же в остальных системах вроде бы с выводом все в порядке.
В общем-то я думаю, что держать где-то наготове один заголовочный-файлик + написание лишних трех строк, всегда проще, чем использовать CharToOem и обратное преобразование. К тому же метод расширяем
interesno2111
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 5
02.07.2010, 23:39  [ТС]     опять о шрифтах #15
Да-а-а.
Ну а в итоге, как должна выглядеть моя начальная программа, чтобы после выполнения она была читаема? Или это некорректный вопрос?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.07.2010, 23:45     опять о шрифтах #16
Цитата Сообщение от PointsEqual Посмотреть сообщение
извиняюсь, вот так работает

C++
1
2
3
4
string str="абвгд";
char *res;
CharToOem(str.c_str(),res);
cout<<res;
но вопрос вот в чем - чтобы перевести string нужно создавать дополнительную переменную(res)? а без нее нельзя никак?
Вот так делать точно нельзя! По сути CharToOem() пишет строку в неинициализированную память, при этом затирая то, что там было. Добром такой подход точно не кончится.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
03.07.2010, 00:08     опять о шрифтах #17
Цитата Сообщение от easybudda Посмотреть сообщение
Вот так делать точно нельзя! По сути CharToOem() пишет строку в неинициализированную память, при этом затирая то, что там было. Добром такой подход точно не кончится.
больше не буду
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
03.07.2010, 01:08     опять о шрифтах #18
В первом приближении как-то так, но есть, куда дальше развивать...
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
#include <iostream>
#include <string>
#include <cstring>
#include <windows.h>
 
class OemString {
private:
    std::string m_buf;
public:
    OemString() : m_buf("") {}
    OemString(const char * pCStr){
        char * pRes = new char [ strlen(pCStr) + 1 ];
        CharToOemA(pCStr, pRes);
        m_buf = std::string(pRes);
        delete [] pRes;
    }
    virtual ~OemString() {}
    friend std::ostream & operator << (std::ostream & ost, const OemString & str){
        ost << str.m_buf;
        return ost;
    }
};
 
int main(){
    OemString s("Превед, Медвед!");
    std::cout << s << std::endl;
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
03.07.2010, 04:56     опять о шрифтах #19
Цитата Сообщение от Mog Посмотреть сообщение
Там тоже у меня не пашет, или я что-то не так делаю?)
В версии 6.0 вроде не пашет
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2010, 10:04     опять о шрифтах
Еще ссылки по теме:

опять же строки C++
Опять файлы C++
Опять указатели C++

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

Или воспользуйтесь поиском по форуму:
Mog
0 / 0 / 1
Регистрация: 18.01.2010
Сообщений: 14
03.07.2010, 10:04     опять о шрифтах #20
Цитата Сообщение от Nameless One Посмотреть сообщение
В версии 6.0 вроде не пашет
да-да, у меня кстати 6.0 - не пашет!!!
Yandex
Объявления
03.07.2010, 10:04     опять о шрифтах
Ответ Создать тему
Опции темы

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