Программы с помощью консоли

Для начала работы с консолью необходимо получить ее дескриптор.

Функция получения дескриптора стандартного устройства ввода, вывода или ошибки в зависимости от переданного константного параметра:
HANDLE WINAPI GetStdHandle(__in DWORD nStdHandle);

nStdHandle может принимать значения

  • STD_INPUT_HANDLE = -10; // устройство ввода
  • STD_OUTPUT_HANDLE = -11; // устройство вывода
  • STD_ERROR_HANDLE = -12; // ошибка

Использование русского языка в консоли с помощью API

Для указания кодовой страницы используются функции

  • Кодовая страница консоли вывода
    BOOL WINAPI SetConsoleOutputCP(UINT wCodePageID);
  • Кодовая страница консоли ввода
    BOOL WINAPI SetConsoleCP(UINT wCodePageID);

где wCodePageID — номер кодовой страницы.
Для перекодировки на русский язык используется кодовая страница wCodePageID=1251 .

Для перекодировки русского текста, введенного в Win-коде также может использоваться функция

Как узнать пароль с помощью консоли? 100%

BOOL WINAPI CharToOem (LPCTSTR lpszSrc, LPSTR lpszDst)

  • lpszSrc – указатель на строку-источник;
  • lpszDst/strong> – указатель на строку-приемник

Возвращаемое значение 1 в случае успешной перекодировки.

Чтение/запись данных в консоль/файл

Для чтения и записи данных в консоль используются функции

BOOL WINAPI ReadFile(
_In_ HANDLE hFile,
_Out_ LPVOID lpBuffer,
_In_ D WORD nNumberOfBytesToRead,
_Out_ LP D WORD lpNumberOfBytesRead,
_Inout_ LPOVERLAPPED lpOverlapped);

BOOL WINAPI WriteFile(
_In_ HANDLE hFile,
_In_ LPCVOID lpBuffer,
_In_ D WORD nNumberOfBytesToWrite,
_Out_ LP D WORD lpNumberOfBytesWritten,
_Inout_ LPOVERLAPPED lpOverlapped);

В случае успешного завершения функции возвращают ненулевое значение.
Аргументы функций

  • hFile -дескриптор файла/консоли. Файл/консоль должен иметь доступ для чтения для функции ReadFile() и доступ для записи для функции WriteFile() .
  • lpBuffer — указатель на буфер (строку) для чтения/записи данных.
  • nNumberOfBytesToWrite — число байтов, которые будут записаны в файл.
  • lpNumberOfBytesWritten — указатель на переменную, которая получает число считанных/записанных байтов.
  • lpOverlapped — указатель на структуру OVERLAPPED , которая используется в операциях асинхронного ввода-вывода (например, получение данных по интерфейсу связи). Для синхронного ввода-вывода данный указатель имеет значение NULL .

Установка заголовка окна консоли

Функция установки заголовка окна консоли

BOOL WINAPI SetConsoleTitle(__in LPCTSTR lpConsoleTitle);

lpConsoleTitle – указатель на строку имени консоли с завершающим нуль-символом

Установка цвета символов и фона в консоли

Цвет символов и фона задается с помощью констант, определяющих тетрады символов.

⚙ Расширь возможности своей Windows — 15 полезных команд сисадмина


Цвет символов

Каждая тетрада, определяющая цвет символов или фона, представляет собой значение от 0 до 15, задаваемая логической суммой соответствующих констант:

Цвета в консоли

Например, цвет символов с кодом 13 задается как

FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY .

Функция определения атрибутов вводимых символов в окне консоли

BOOL WINAPI SetConsoleTextAttribute(
__in HANDLE hConsoleOutput,
__in WORD wAttributes);

  • hConsoleOutput – дескриптор буфера консоли вывода;
  • wAttributes – цвет букв и фона, получаемый путем комбинации констант
Читайте также:
Программа на Айфоне которая меняет номер

Функция, задающая цвет фона консоли(путем закрашивания фона отдельных символов)

BOOL WINAPI FillConsoleOutputAttribute(
__in HANDLE hConsoleOutput,
__in WORD wAttribute,
__in D WORD nLength,
__in COORD dwWriteCoord,
__out LP D WORD lpNumberOfAttrsWritten);

  • hConsoleOutput – дескриптор буфера вывода консоли;
    wAttribute – атрибут цвета фона символа в консоли;
  • nLength – количество ячеек символов, фон которых устанавливается заданным цветом;
  • dwWriteCoord – координаты первой закрашиваемой ячейки;
  • lpNumberOfAttrsWritten – указатель на идентификатор, в который записывается количество реально закрашенных ячеек.

Для того чтобы изменить цвет всего окна консоли необходимо задать цвет символов, количество которых определяется размером окна консоли. Размер стандартного окна консоли 80×25 = 2000 символов.

Установка позиции курсора

Функция установки позиции курсора в окне консоли

BOOL WINAPI SetConsoleCursorPosition(
__in HANDLE hConsoleOutput,
__in COORD dwCursorPosition);

hConsoleOutput – дескриптор буфера вывода консоли;
dwCursorPosition – структура координат COORD, определяющая позицию курсора.

Структура координат представляет собой

struct COORD
short X;
short Y;
>;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#include
int main()
D WORD l;
COORD point;
point.X = 0; point.Y = 0;
HANDLE hout = GetStdHandle( STD_OUTPUT_ HANDLE );
HANDLE hin = GetStdHandle( STD_INPUT_ HANDLE );
char title[] = «Консольная программа» ;
CharToOem (title, title);
SetConsoleTitle(title);
SetConsoleOutputCP(1251);
SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_INTENSITY);
FillConsoleOutputAttribute(hout, 0, 2000, point, // очистка экрана
for ( int y = 0; y < 16; y++) point.Y = y;
FillConsoleOutputAttribute(hout, y SetConsoleCursorPosition(hout, point);
>
char c;
ReadFile(hin, l, NULL );
return 0;
>

Цветная консоль

Результат выполнения

Примечание: для корректной компиляции программы необходимо изменить тип кодировки проекта на многобайтовую.

Комментариев к записи: 2

Visual C++ 2008 Express. На строчке HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE); Вылетает ошибка: «error C2275: HANDLE: недопустимое использование этого типа в качестве выражения c:program filesmicrosoft sdkswindowsv6.0aincludewinnt.h(402): см. объявление ‘HANDLE’». Дальше (поскольку не смог объявить hout) валом валят другие обишки (C2275 повторяется ещё раз): error C2146: синтаксическая ошибка: отсутствие «;» перед идентификатором «hout» error C2065: hout: необъявленный идентификатор warning C4047: =: ‘int’ отличается по уровням косвенного обращения от ‘HANDLE’ error C2275: HANDLE: недопустимое использование этого типа в качестве выражения c:program filesmicrosoft sdkswindowsv6.0aincludewinnt.h(402): см. объявление ‘HANDLE’ Чего ему не хватает-то?!

Всё, разобрался. Объявления должны стоять до инициализирующих конструкций. В статье сначала идёт присваивание point.X и point.Y, а затем объявление хендлов. Поменял местами, сгруппировал все объявления (которые с указанием типа),в начале функции main() — и ошибки исчезли.

Источник: prog-cpp.ru

Тестирование консольной программы с помощью bat-файла

Типичная ситуация: вы написали программу и хотите проверить ее работу. Проводить тесты вручную неудобно. Нужно как-то автоматизировать этот процесс. Что если использовать bat-файлы?

Простейший случай
Предположим, тестируемая программа имеет вид:

#include #include int main(int argc, char* argv[]) < if(argc < 2) < printf(«errorrn»); return -1; >int val = atoi(argv[1]); return 2*val; >

В этом случае, проверяющий ее работу bat-файл, будет иметь вид (здесь и далее, test — имя тестируемой программы):

Читайте также:
Сколько минут идет произвольная программа в фигурном катании

test 56 if %ERRORLEVEL%==112 ( echo success ) else ( echo error )

Типичный случай
Разумеется так, как показано выше программы никто не пишет. Переменная ERRORLEVEL содержит либо ноль (в случае успеха), либо код ошибки. В нашем случае он не представляет особого интереса. Обычный вид тестируемой программы показан ниже.

#include int main()

Сразу возникает два вопроса. Во-первых, как сэмулировать ввод числа в программу (ключи запуска не подходят, программа их даже не смотрит). Во-вторых, как проанализировать ее вывод (переменная ERRORLEVEL всегда будет равна нулю). На помощь приходит возможность перенаправления ввода/вывода.

Способ 1. 2 файла
Первый вариант основан на использовании двух текстовых файлов. Первый (назовем его in.txt) содержит значение, которое должно быть «прочитано» программой. Второй (назовем его out.txt) будет содержать вывод программы, то есть все то, что она выводит на консоль. Запуск программы будет выглядеть так

test out.txt

Если в файле in.txt содержится строка «83», то файл out.txt будет содержать текст:

Enter number
result = 166

Осталось только проанализировать его содержимое с помощью цикла for /F.

Способ 2. 1 файл
Недостатком первого способа является использование двух файлов. Если вы хотите проводить несколько тестов, то вам понадобится отдельный файл с входными данными для каждого теста. Способ 2 лишен этого недостатка. В нем тестируемая программа запускается так:

echo 55 | test > out.txt

Здесь в качестве входных данных для программы test выступает вывод команды echo 55, то есть число 55 в виде строки. вывод программы test как и в первом способе записывается в файл out.txt.

Если вы хотите провести несколько тестов, то можно написать так:

echo 55 | test > out.txt echo 84 | test >> out.txt echo 13 | test >> out.txt

Оператор >> говорит о том, что файл out.txt не будет перезаписан. Весь вывод повторных запусков программы test.exe будет дописан в конец файла. Таким образом, он будет содержать:

Enter number
result = 110
Enter number
result = 168
Enter number
result = 26

Все что остается, это, как и в первом способе, проанализировать содержимое файла out.txt.

Способ 3. 0 файлов
Можно и вообще обойтись без файлов. Для этого нужно использовать команду find, осуществляющую поиск подстроки. Программа test выводит только одно число — результат своей работы. Этим мы и воспользуемся. Тестовый запуск выглядит так:

echo 55 | test | find «110» >nul if ERRORLEVEL 1 ( echo error ) else ( echo success )

Отличие от второго способа в том, что вывод тестируемой программы test направляется на вход утилите find, которая ищет в нём правильный результат работы. Если он найден, то переменная ERRORLEVEL устанавливается в единицу, если нет, то она равна нулю.

Чтобы find не выводила в консоль найденную строку, весь ее вывод направляется в фиктивное устройство nul, то есть попросту выбрасывается.

Читайте также:
Как правильно писать конкурсно игровая программа

Заключение
Мы рассмотрели различные способы эмулирования ввода/вывода для тестирования ваших консольных программ. Какой способ выбрать, зависит от целей тестирования и ваших личных предпочтений.

Источник: norseev.ru

Как получить вывод консоли на C ++ с помощью программы Windows?

Если у меня есть встроенная программа Windows С++ (т.е. точка входа WinMain), как я могу просмотреть вывод из функций консоли, таких как std:: cout?

Obediah Stane 10 окт. 2008, в 17:35
Поделиться
Вы пытаетесь прочитать вывод или вывод других приложений?
Mark Ingram 10 окт.

2008, в 15:26
Поделиться:

10 ответов

Посмотрите, как добавить консольный ввод/вывод в приложение Win32 GUI. Это может помочь вам сделать то, что вы хотите.

Если у вас нет или вы не можете изменить код, попробуйте советы, найденные здесь, чтобы перенаправить вывод консоли в файл.

Редактировать: немного нить некромантии здесь. Я впервые ответил на это 9 лет назад, в первые дни SO, до того, как (хорошая) политика ответов, не связанных только с ссылками, вступила в силу. Я перепишу код из оригинальной статьи в надежде искупить мои прошлые грехи.

guicon.cpp — функция перенаправления консоли

#include #include #include #include #include #include #ifndef _USE_OLD_IOSTREAMS using namespace std; #endif // maximum mumber of lines the output console should have static const WORD MAX_CONSOLE_LINES = 500; #ifdef _DEBUG void RedirectIOToConsole() < int hConHandle; long lStdHandle; CONSOLE_SCREEN_BUFFER_INFO coninfo; FILE *fp; // allocate a console for this app AllocConsole(); // set the screen buffer to be big enough to let us scroll text GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize.Y = MAX_CONSOLE_LINES; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); // redirect unbuffered STDOUT to the console lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, «w» ); *stdout = *fp; setvbuf( stdout, NULL, _IONBF, 0 ); // redirect unbuffered STDIN to the console lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, «r» ); *stdin = *fp; setvbuf( stdin, NULL, _IONBF, 0 ); // redirect unbuffered STDERR to the console lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); fp = _fdopen( hConHandle, «w» ); *stderr = *fp; setvbuf( stderr, NULL, _IONBF, 0 ); // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog // point to console as well ios::sync_with_stdio(); >#endif //End of File

guicon.h — интерфейс к функции перенаправления консоли

#ifndef __GUICON_H__ #define __GUICON_H__ #ifdef _DEBUG void RedirectIOToConsole(); #endif #endif // End of File

test.cpp — демонстрация перенаправления консоли

#include #include #include #include #include #ifndef _USE_OLD_OSTREAMS using namespace std; #endif #include «guicon.h» #include int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) < #ifdef _DEBUG RedirectIOToConsole(); #endif int iVar; // test stdio fprintf(stdout, «Test output to stdoutn»); fprintf(stderr, «Test output to stderrn»); fprintf(stdout, «Enter an integer to test stdin: «); scanf(«%d», printf(«You entered %dn», iVar); //test iostreams cout > iVar; cout > iVar; wcout //End of File

Источник: overcoder.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru