C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вывод таблицы символов ASCII в консоли  (Прочитано 8792 раз)
HARARA
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 14


« : 27 Ноябрь 2011, 12:27:31 »

Всем добрый день!
Не знаю в правильный ли раздел я пишу)
Ситуация в следующем. Пишу простую консольную программу на C++ Builder 6. Программа выводит символ ASCII по введенному коду.
Код:
//---------------------------------------------------------------------------

#include
#pragma hdrstop
#include
#include
#include
//---------------------------------------------------------------------------

#pragma argsused

void ascii(int n)
{
        if(n>=0 && n<256)
        {
                cout<<"\nSimvol sootv ASCII codu "<          }
        else
                cout<<"\nError";
 }

void main()
{
        int n=0;
        cout<<"Vvedite n\n";
        cin>>n;
        ascii(n);
        getch();
}

Проблема заключается в том, что символы с кодами:
7 -  BEL
8 -  BS
9 -  HT
10 - LF
13 - CR
На экран не воводятся, вместо этого программа совершает действия закрепленные за ними (перевод строки, табуляция, возврат каретки и т.д.).
Можно ли как-то все-таки заставить ее не выполнять эти действия а выводить сами символы?
Заранее благодарю.
Записан
Nikita
Участник


Сказали спасибо: +6/-1
Offline

Сообщений: 476


« Ответ #1 : 27 Ноябрь 2011, 13:26:34 »

Попробуй выводить через printf, не уверен но попробовать стоит.
Записан
HARARA
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 14


« Ответ #2 : 27 Ноябрь 2011, 13:42:31 »

Пробовал и через printf, и через putch, не помогает 
Выводит все символы нормально кроме этих 5-ти.
Записан
Nikita
Участник


Сказали спасибо: +6/-1
Offline

Сообщений: 476


« Ответ #3 : 27 Ноябрь 2011, 15:36:58 »

попробуй функцию putc, только выходной поток открой в двоичном режиме.
Записан
HARARA
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 14


« Ответ #4 : 27 Ноябрь 2011, 17:46:30 »

Имеется в виду запись в двоичный файл а потом считывание из него? Если да, то тоже пробовал, а если нет, то можно поподробней, что имеется в виду и как это делается?
« Последнее редактирование: 27 Ноябрь 2011, 18:01:06 от HARARA » Записан
Nikita
Участник


Сказали спасибо: +6/-1
Offline

Сообщений: 476


« Ответ #5 : 27 Ноябрь 2011, 19:15:29 »

Вообще то все файлы двоичные. Чтобы двоичный файл был текстовым его нужно открыть как текстовый, тогда "перевод строки-возврат каретки" будет печататься одним символом а не двумя.
Вывод на консоль идет как текстовый вывод, следовательно нужно сделать этот вывод двоичным ,тогда должно все печататься как есть. Я сам не пробовал так, но мысли такие, думаю копать в эту сторону нужно.

А то что ты выводил в файл а потом считывал с него то это бессмысленно, в файле все хранится в двоичном виде, а вот как потом открывать этот файл (двоичный или текстовый) от этого и зависит отображение некоторых символов.
Записан
HARARA
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 14


« Ответ #6 : 27 Ноябрь 2011, 19:46:01 »

Пробовал открывать и в двоичном и в текством, все равно та же фигня.
Записан
Kray74
Посты на падонкаффском принципиально не читаю.
Участник


Сказали спасибо: +81/-1
Offline

Сообщений: 366


« Ответ #7 : 27 Ноябрь 2011, 20:43:48 »

А что вы хотите увидеть, печатая эти символы (7, 10, 13 и т.д.)? Для них не существует видимого изображения.
Записан
Nikita
Участник


Сказали спасибо: +6/-1
Offline

Сообщений: 476


« Ответ #8 : 27 Ноябрь 2011, 20:54:32 »

Пробовал открывать и в двоичном и в текством, все равно та же фигня.

Когда ты открываешь файл как двоичный, то и символы считываются как двоичные, а когда ты их пытаешься отобразить на своей консоли то они отображаются как текстовые.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


« Ответ #9 : 27 Ноябрь 2011, 21:41:06 »

Цитировать
Для них не существует видимого изображения.
Специально для таких целей существует ключик MB_USEGLYPHCHARS, заставляющий функции вывода (типа WriteConsole для консольных приложений или TextOut для виндовых) трактовать управляющие символы как печатаемые. У Каплана в блоге было, и вот тут тоже...

Все, что нужно сделать - это записать символ в char, сконвертировать его с этим ключом в WideChar и вывести в консоль.
Записан
HARARA
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 14


« Ответ #10 : 28 Ноябрь 2011, 08:24:04 »

Посмотрите правильно ли пишу.
Код:
int MultiByteToWideChar(
  __in   UINT CodePage,
  __in   DWORD dwFlags,
  __in   LPCSTR lpMultiByteStr,
  __in   int cbMultiByte,
  __out  LPWSTR lpWideCharStr,
  __in   int cchWideChar
);
Объявляю две переменные
Код:
char ch[255];
char ch2[255];
В качестве первого аргумента указываю CP_ACP
В качестве второго MB_USEGLYPHCHARS
В качестве третьего указываю строку в которую записал символ ch
В качестве четвертого пишу размер, т.к. символ один то пишу 255
В качестве пятого указываю строку в которую записывается результат ch2
В качестве шестого пишу его размер 255
Получается что-то типа:
Код:
MultiByteToWideChar(CP_ACP, MB_USEGLYPHCHARS, ch, 255, ch2, 255)
Выдает две ошибки:
Cannot convert 'char *' to 'wchar_t *
Type mismatch in parameter 'lpWideCharStr' (wanted 'wchar_t *', got 'char *')
Записан
moskk
-Кто же это ходит за мёдом с воздушными шариками?
Участник


Сказали спасибо: +17/-4
Offline

Сообщений: 264

-Я хожу.


« Ответ #11 : 28 Ноябрь 2011, 09:26:07 »

Код:
wchar_t ch2[255];
, очевидно же.
Записан
HARARA
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 14


« Ответ #12 : 28 Ноябрь 2011, 12:04:25 »

Код:
wchar_t ch2[255];
, очевидно же.
Туплю, просто)
Вообщем сделал так
Код:
char ch[255];
wchar_t ch2[255];
ch[0]=n;
MultiByteToWideChar(CP_ACP, MB_USEGLYPHCHARS, ch, 255, ch2, 255);
printf("\n %c", ch[0]);
Все равно даёт тот же результат, выводит всё кроме этих символов.
Через WriteConsole тоже самое.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


« Ответ #13 : 28 Ноябрь 2011, 12:15:57 »

Цитировать
Все равно даёт тот же результат
Естественно. Ты ж выводишь опять тот же самый, неконвертированный символ. Выводить надо wchar_t, а не char, в этом все и дело.
Записан
HARARA
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 14


« Ответ #14 : 28 Ноябрь 2011, 12:41:06 »

 Собственно и вывод wchar_t даёт тот же самый результат.
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


« Ответ #15 : 28 Ноябрь 2011, 14:26:29 »

Собственно, я, конечно, тебе верю, но почему-то я вижу тут BULLET... Что я делаю не так все время?
Записан
HARARA
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 14


« Ответ #16 : 29 Ноябрь 2011, 07:59:22 »

Это безусловно сильное колдовство  
Ниче не понимаю, уже полностью переписал, а результат тот же. Видимо не судьба  
Код:
#include
#pragma hdrstop
#pragma argsused

#include
#include
#include
#include

using namespace std;

void ascii(int n)
{
        if(n>=0 && n<256)
        {
                char s[2]={0};
                DWORD nWrote;
                WCHAR msg[2];
                s[0]=(unsigned char)n;
                HANDLE StdIO=GetStdHandle(STD_OUTPUT_HANDLE);
                MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED|MB_USEGLYPHCHARS,
                (LPCSTR)s,2,
                msg,2);
                COORD dwCursorPosition={3,1};
                SetConsoleCursorPosition(StdIO,dwCursorPosition);
                WriteConsoleW(StdIO, &msg, 2, &nWrote, NULL);
         }
        else
                cout<<"\nError";
 }

int _tmain()
{
        int n=0;
        cout<<"Vvedite n\n";
        cin>>n;
        ascii(n);
        getch();
}
//---------------------------------------------------------------------------
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


« Ответ #17 : 29 Ноябрь 2011, 11:30:50 »

Цитировать
Это безусловно сильное колдовство
Не во всяком шрифте есть эти символы.

Это "колдовство" называется "Lucuda Console" (обрати внимание на приписку: "It is a variant of Lucida Sans Typewriter with smaller line spacing, and added WGL4 character set." Вот его то, Windows Glyph List, нам и надо. Именно там все эти глифы присутствуют). Поэтому у меня всегда для консоли выставлен именно этот шрифт.
Записан
HARARA
Участник


Сказали спасибо: +0/-0
Offline

Сообщений: 14


« Ответ #18 : 29 Ноябрь 2011, 11:43:40 »

Заработало 
volvo877 Огромное Вам спасибо, что наставили меня дурака на путь истинный!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.06 секунд. Запросов: 20.