Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2012, 18:41   #1
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию Как вывести массив символов в MessagBox

Приветствую! Как правильно преобразовать содержимое буфера, чтобы эта строка корректно отображалась независимо от настроек проекта Visual C++ 2008 Express Edition:

"Использовать многобайтовую кодировку"
"Использовать Юникод-кодировку"

С константными строками нужно использовать макрос _T(), что я и делаю. А как быть с массивами символов?

Код:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#define BSIZE 10

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    FILE* fp;
    char buf[BSIZE];

    fp = fopen("file.txt", "r");

    if (fp == NULL) {
        MessageBox(NULL, _T("Error: cannot open file."), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    fgets(buf, BSIZE, fp);

    MessageBox(NULL, buf, _T("Message"), 0);

    return TRUE;
}
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 14:27   #2
StIX-S
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 69
По умолчанию

MultiByteToWideChar();
WideCharToMultiByte();
IsTextUnicode();

Ещё можно посмотреть здесь.

Последний раз редактировалось StIX-S; 01.06.2012 в 14:29.
StIX-S вне форума Ответить с цитированием
Старый 01.06.2012, 15:43   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Спасибо! Да... с кодировками не всё так просто...

Если написать:
Код:
TCHAR buf[BSIZE];
то fgets проблемы. Сразу и не получается разобраться.

Последний раз редактировалось 8Observer8; 01.06.2012 в 15:47.
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 16:15   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

поверьте, лучше применять лишь юникод, и быстрее(нет конвертирования) и проще.
исключения если нужны старые винды.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.06.2012, 16:37   #5
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

То есть в настройках выставить: "Использовать Юникод-кодировку"?

Вот так? Я правильно понял?

Код:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>

#define BSIZE 10

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    FILE* fp;
    WCHAR wbuf[BSIZE];
    CHAR cbuf[BSIZE];

    fp = fopen("file.txt", "r");

    if (fp == NULL) {
        MessageBox(NULL, _T("Error: cannot open file."), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    fgets(cbuf, BSIZE, fp);

    mbstowcs(wbuf, cbuf, BSIZE);
    MessageBox(NULL, wbuf, _T("Message"), 0);

    return TRUE;
}
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 16:45   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

да, только MultiByteToWideChar, та С-функция не переносит русский.

и в вашем случае вы забываете про терминальный символ.
строка должна быть BSIZE+1(и не помню этот момент, но массив нужно инициализировать, хотя бы его [BSIZE] элемент, чтоб терминал всегда был)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 01.06.2012 в 17:48.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.06.2012, 16:49   #7
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Пепел Феникса, большое спасибо!
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 17:58   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Для сих целей необходимо использовать массив TCHAR и отображения функций из tchar.h. Их список можно поглядеть по ссылке http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx.
Для fgets это _fgetts
netrino вне форума Ответить с цитированием
Старый 01.06.2012, 18:20   #9
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Ого! Супер! Спасибо огромное!

Код:
#include <windows.h>
#include <tchar.h>
#include <stdio.h>

#define BSIZE 10

int WINAPI _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR lpCmdLine,
                     int nCmdShow)
{
    FILE* fp;
    TCHAR buf[BSIZE];

    fp = fopen("file.txt", "r");

    if (fp == NULL) {
        MessageBox(NULL, _T("Error: cannot open file."), _T("Error"), MB_ICONERROR);
        return FALSE;
    }

    _fgetts(buf, BSIZE, fp);

    MessageBox(NULL, buf, _T("Message"), 0);

    return TRUE;
}
8Observer8 вне форума Ответить с цитированием
Старый 01.06.2012, 18:30   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тоже вариант, но честно говоря есть минус в том что вы вместе с настройками проекта выбираете и какого типа файл в можете прочесть(или UCS2 или ANSI)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вывести значения с нужным количеством символов после запятой kity SQL, базы данных 3 17.01.2012 18:16
Дан массив, состоящий из символов. Вывести на экран цифру, наиболее часто встречающуюся в этом массиве. Andros_me Помощь студентам 2 21.12.2010 08:50
Как в Delphi вывести значения без пробелов и лишних символов Lesa1988 Помощь студентам 0 25.11.2010 21:45
Как конвертировать массив символов в массив байт davinci C++ Builder 6 30.10.2010 18:09
как присвоить все три значения вектору В и вывести его как массив столбец при вызове функции Tomoa Microsoft Office Excel 8 08.03.2010 20:42