Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/20: Рейтинг темы: голосов - 20, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 5
1

опять о шрифтах

02.07.2010, 20:20. Показов 3939. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
приветствую. Имеется программа из учебника:
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;
}
Однако, после выполнения результат - квазябра, типа иероглифы.
Что сделано неправильно? я вот - не знаю.
Может кто в курсе? Сообщите, если не лень.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2010, 20:20
Ответы с готовыми решениями:

о шрифтах
в Офисе внезапно поменялись некоторые шрифты. Все бы ничего, но на принтер выводятся иероглифы. ...

...И еще о шрифтах...
Доброе время суток! Возможно, вопрос не по адресу, но может, кто ответит, на скорее для многих...

О безопасных шрифтах
Общепринятой является практика, что в font-family, помимо основного шрифта (изначально...

Есть ли разница в шрифтах?
Здравствуйте! Шрифт OpenSans SemiBold и OpenSans SemiBold Regular это один и тот же шрифт? Просто...

21
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
02.07.2010, 20:30 2
На Dev-C++ сетлокал не работает, используйте другие способы, например CharToOem
1
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
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);
так?
0
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 5
02.07.2010, 20:51  [ТС] 4
Цитата Сообщение от M128K145 Посмотреть сообщение
На Dev-C++ сетлокал не работает, используйте другие способы, например CharToOem
А чем можно пользоваться чтобы сетлокол работал? (про CharToOem - спасибо)
0
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
02.07.2010, 20:58 5
Цитата Сообщение от interesno2111 Посмотреть сообщение
А чем можно пользоваться чтобы сетлокол работал? (про CharToOem - спасибо)
Visual Studio
0
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 5
02.07.2010, 21:08  [ТС] 6
И все?
0
0 / 0 / 1
Регистрация: 18.01.2010
Сообщений: 14
02.07.2010, 21:15 7
Цитата Сообщение от besstiaa Посмотреть сообщение
Visual Studio
Там тоже у меня не пашет, или я что-то не так делаю?)
0
94 / 94 / 14
Регистрация: 04.06.2010
Сообщений: 223
02.07.2010, 21:23 8
Цитата Сообщение от Mog Посмотреть сообщение
Там тоже у меня не пашет, или я что-то не так делаю?)
Всё работает. VS 2008
0
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);
так?
.

т.е. строковые литералы заводить как переменную?
а если их в программе много?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12459 / 7483 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
02.07.2010, 22:40 10
Цитата Сообщение от PointsEqual Посмотреть сообщение
CharToOem(res,res);
так в принципе работать не будет - std::string::c_str() возвращает указатель на константную строку.
0
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
02.07.2010, 22:49 11
извиняюсь, вот так работает

C++
1
2
3
4
string str="абвгд";
char *res;
CharToOem(str.c_str(),res);
cout<<res;
но вопрос вот в чем - чтобы перевести string нужно создавать дополнительную переменную(res)? а без нее нельзя никак?
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 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. Установка связки "локаль-поток", понятное дело что связывать надо только нужные потоки.

вроде бы все. способ чудесно работает для всех видов ввода и вывода
1
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
02.07.2010, 22:58 13
Цитата Сообщение от fasked Посмотреть сообщение
#include "cp866.h"
у меня не находит такой, аа вон он) увидел
0
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
02.07.2010, 23:01 14
Цитата Сообщение от PointsEqual Посмотреть сообщение
у меня не находит такой, аа вон он) увидел
да-да, содержимое находится под катом, в заголовке лежит класс локали, который для красоты главного файла был туда и спрятан собственно
кстати, реализация опять же под windows, потому что использовать самописанные chartooem и oemtochar не хочется, к тому же в остальных системах вроде бы с выводом все в порядке.
В общем-то я думаю, что держать где-то наготове один заголовочный-файлик + написание лишних трех строк, всегда проще, чем использовать CharToOem и обратное преобразование. К тому же метод расширяем
1
0 / 0 / 0
Регистрация: 30.06.2010
Сообщений: 5
02.07.2010, 23:39  [ТС] 15
Да-а-а.
Ну а в итоге, как должна выглядеть моя начальная программа, чтобы после выполнения она была читаема? Или это некорректный вопрос?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12459 / 7483 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
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() пишет строку в неинициализированную память, при этом затирая то, что там было. Добром такой подход точно не кончится.
1
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
03.07.2010, 00:08 17
Цитата Сообщение от easybudda Посмотреть сообщение
Вот так делать точно нельзя! По сути CharToOem() пишет строку в неинициализированную память, при этом затирая то, что там было. Добром такой подход точно не кончится.
больше не буду
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12459 / 7483 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
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;
}
1
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.07.2010, 04:56 19
Цитата Сообщение от Mog Посмотреть сообщение
Там тоже у меня не пашет, или я что-то не так делаю?)
В версии 6.0 вроде не пашет
0
0 / 0 / 1
Регистрация: 18.01.2010
Сообщений: 14
03.07.2010, 10:04 20
Цитата Сообщение от Nameless One Посмотреть сообщение
В версии 6.0 вроде не пашет
да-да, у меня кстати 6.0 - не пашет!!!
0
03.07.2010, 10:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2010, 10:04
Помогаю со студенческими работами здесь

Вопрос о шрифтах в WORDe
Здравствуйте, господа программисты и пользователи!...

Опять MDI и опять нет активной формы
В общем, перед тем, как налетать на меня за эту тему, скажу, что я потратил более 6 часов на...

Разница в шрифтах кода и макета
Верстаю макет по примеру. В макете шрифт Arial MT. В стилях у меня: font-family: Arial,...

Как изменять слово во шрифтах в определённом месте?
Я понимаю что вопрос идиотский ,но мне нужен на него ответ.Мне нужно чтоб определённое слово...

В WinMe пропали кириллические знаки в системных шрифтах *.fon
В WinMe пропали кириллические знаки в системных шрифтах *.fon - типа. Вместо кириллицы крякозябры...

Опять БАН опять Яндекс...
Вообщем ситуация такая, был сайт, написаный на дримвевере, отлично индексируемый и имеющий 400-500...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru