04.07.2007, 09:47
общий
это ответ
Здравствуйте, Савин Валерий Николаевич!
conio.h не входит в стандарт с++, т.к. зависит от ОС, поэтому в каждом компиляторе сделан по-своему и имеет разные возможности. В Windows в этом файле поддерживается только функция char getch() - чтение нажатого символа. Остальные (цвет и положение) досрупны через WinApi (при этом теряется кроссплатформенность программы). А Code::Blocks никогда не видел, так что не знаю, будет ли там работать, всё, что я написал, хотя вроде должно.
Насчёт разбора параметров, правильнее будет разбирать их так:
#include <iostream>
using namespace std;
int main (int argc, char* argv[])
{
//Переменные параметров
bool param1 = false;
bool param_count = false;
int param_count_val = 0;
//Программа распознаёт парамерты вида /param1 /count 50 в любом порядке
for (int i = 0; i < argc; i++)
{
if (strcmp(argv[i], "/param1") == 0)
param1 = true;
if (strcmp(argv[i], "/count") == 0)
param_count = true;
if (param_count && argc > i)
param_count_val = atoi(argv[i + 1]);
}
if (param1)
cout << "param1 used" << endl;
if (param_count)
cout << "count is " << param_count_val << endl;
return 0;
}
Насчёт нажатия кнопок:
#include <iostream>
#include <conio.h>
using namespace std;
int main (int argc, char* argv[])
{
char c = 0;
//Цикл пока не нажата клавиша выхода
while (c != ‘Q‘)
{
//Очистка экрана
system("cls");
//Меню
cout << "MenuItem1 - 1" << endl;
cout << "MenuItem2 - 2" << endl;
cout << "Exit - Q" << endl;
//Чтение клавиши
c = toupper(getch());
//Действия
switch (c)
{
case ‘1‘:
cout << "MenuItem1 selected" << endl;
getch();
break;
case ‘2‘:
cout << "MenuItem2 selected" << endl;
getch();
break;
}
}
return 0;
}
Насчёт conio смотрите в приложении, я там писал класс для работы с консолью, наверное разберётесь.
#include "Console.h"
using namespace std;
int main()
{
//Установка заголовка окна
console.SetTitle("Работа с консолью");
//Ввод имени файла
console.Write("Введите имя файла: ");
string filename = console.ReadLine();
//Установка цвета
console.SetColor(clRed);
console.WriteLine("Вы выбрали файл " + filename);
//Задержка
console.Pause();
return 0;
}
Приложение:
#pragma once#include <iostream>#include <string>#include <windows.h>using namespace std;//Размер буфера ввода#define MAX_STRING 1024//Цвета в консолиenum ConsoleColor{ clBlack = 0, clNavy = 1, clGreen = 2, clTeal = 3, clBrown = 4, clPurple = 5, clOlive = 6, clGray = 7, clSilver = 8, clBlue = 9, clLime = 10, clCyan = 11, clRed = 12, clMagneta = 13, clYellow = 14, clWhite = 15,};//Класс для работы с консольюclass Console{private: //Указатель на стандатрный вывод HANDLE hStdout; //Указатель на стандатрный ввод HANDLE hStdin; //Поток ввода istream& in; //Поток вывода ostream& out;public: //Конструктор (с привязкой к потокам) Console(istream& in, ostream& out); //Очистка экрана void Clear(); //Задержка void Pause(); //Получение заголовка окна string GetTitle(); //Установка заголовка окна void SetTitle(string title); //Получение цвета текста WORD GetColor(); //Установка цвета текста void SetColor(WORD color); //Получение цвета фона WORD GetBgColor(); //Установка цвета фона void SetBgColor(WORD color); //Получение позиции курсора COORD GetCursorPos(); //Установка позиции курсора void SetCursorPos(short X, short Y); //Получение размеров окна (в символах) COORD GetWindowSize(); //Вывод символа void Write(char c); //Вывод строки (с преобразованием кодировки) void Write(string text); //Переход на новую строку void WriteLine(); //Вывод строки (с преобразованием кодировки и переходом на новую строку) void WriteLine(string text); //Чтение строки (не пустой) string ReadLine(); //Чтение целого числа (со знаком) long ReadLong(); //Чтение целого числа (без знака) unsigned long ReadULong(); //Чтение действительного числа double ReadDouble(); //Чтение кода нажатой клавиши (с ожиданием) char ReadKey();};//Ссылка на объект стандартной консолиextern Console console;#include "Console.h"//Объект стандартной консолиConsole console(cin, cout);//Конструктор (с привязкой к потокам)Console::Console(istream& in, ostream& out) : in(in), out(out){ //Получение указателей на стандартный ввод и вывод hStdout = GetStdHandle(STD_OUTPUT_HANDLE); hStdin = GetStdHandle(STD_INPUT_HANDLE);}//Очистка экранаvoid Console::Clear(){ system("cls");}//Задержкаvoid Console::Pause(){ system("pause");}//Получение заголовка окнаstring Console::GetTitle(){ //Буфер char buffer[MAX_STRING]; //Получение заголовка окна GetConsoleTitleA(buffer, MAX_STRING); //Преобразование кодировки OemToCharA(buffer, buffer); //Возврат строки return string(buffer);}//Установка заголовка окнаvoid Console::SetTitle(string title){ //Буфер char buffer[MAX_STRING]; strcpy_s(buffer, MAX_STRING, title.c_str()); //Преобразование кодировки CharToOemA(buffer, buffer); //Установка заголовка окна SetConsoleTitleA(buffer);}//Получение цвета текстаWORD Console::GetColor(){ //Информация о консоли CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //Получение информации о консоли GetConsoleScreenBufferInfo(hStdout, &csbiInfo); //Возврат цвета return csbiInfo.wAttributes % 16;}//Установка цвета текстаvoid Console::SetColor(WORD color){ SetConsoleTextAttribute(hStdout, color + GetBgColor() * 16);}//Получение цвета фонаWORD Console::GetBgColor(){ //Информация о консоли CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //Получение информации о консоли GetConsoleScreenBufferInfo(hStdout, &csbiInfo); //Возврат цвета return csbiInfo.wAttributes / 16;}//Установка цвета фонаvoid Console::SetBgColor(WORD color){ SetConsoleTextAttribute(hStdout, color * 16 + GetColor());}//Вывод символаvoid Console::Write(char c){ out << c;}//Вывод строки (с преобразованием кодировки)void Console::Write(string text){ //Буфер char buffer[MAX_STRING]; //Преобразование кодировки CharToOemA(text.c_str(), buffer); out << buffer;}//Переход на новую строкуvoid Console::WriteLine(){ out << endl;}//Вывод строки (с преобразованием кодировки и переходом на новую строку)void Console::WriteLine(string text){ //Буфер char buffer[MAX_STRING]; //Преобразование кодировки CharToOemA(text.c_str(), buffer); out << buffer << endl;}//Получение позиции курсораCOORD Console::GetCursorPos(){ //Информация о консоли CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //Получение информации о консоли GetConsoleScreenBufferInfo(hStdout, &csbiInfo); return csbiInfo.dwCursorPosition;}//Установка позиции курсораvoid Console::SetCursorPos(short X, short Y){ //Координаты курсора COORD p; p.X = X; p.Y = Y; SetConsoleCursorPosition(hStdout, p);}//Получение размеров окна (в символах)COORD Console::GetWindowSize(){ //Информация о консоли CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //Получение информации о консоли GetConsoleScreenBufferInfo(hStdout, &csbiInfo); return csbiInfo.dwMaximumWindowSize;}//Чтение кода нажатой клавиши (с ожиданием)char Console::ReadKey(){ //Количество собылий DWORD n; //Данные о вводе INPUT_RECORD record; //Символ char c; //Цикл ожидания нажатия клвиши for ( ; ; ) { //Если невозможно прочесть событие if (!ReadConsoleInputA(hStdin, &record, 1L, &n ) || (n == 0L)) { //Установка признака конца файла и выход c = EOF; break; } //Если нажата клавиша if ((record.EventType == KEY_EVENT) && record.Event.KeyEvent.bKeyDown) //Если нажата символьная клавиша, выход if (c = static_cast<char>(record.Event.KeyEvent.uChar.AsciiChar)) break; } //Возврат символа return c;}//Чтение строки (не пустой)string Console::ReadLine(){ //Буфер char buffer[MAX_STRING]; do //Чтение строки in.getline(buffer, MAX_STRING); //Пока строка пустая while (strlen(buffer) < 1); //Возврат текста return string(buffer);}//Чтение целого числа (со знаком)long Console::ReadLong(){ //Значение long val; //Текст ошибки char* err; //Буфер string str; //Ввод и преобразование val = strtol((str = ReadLine()).c_str(), &err, 10); //Если имеется текст ошибки while (strlen(err) > 0) { //Повтор ввода Write("Ожидается целое число: "); val = strtol((str = ReadLine()).c_str(), &err, 10); } //Возврат значения return val;}//Чтение целого числа (без знака)unsigned long Console::ReadULong(){ //Значение long val; //Буфер string str; //Текст ошибки char* err; //Ввод и преобразование val = strtol((str = ReadLine()).c_str(), &err, 10); //Если имеется текст ошибки или значение < 0 while (strlen(err) > 0 || val < 0) { //Повтор ввода Write("Ожидается целое неотрицательное число: "); val = strtol((str = ReadLine()).c_str(), &err, 10); } //Возврат значения return static_cast<unsigned long>(val);}//Чтение действительного числаdouble Console::ReadDouble(){ //Значение double val; //Буфер string str; //Текст ошибки char* err; //Ввод и преобразование val = strtod((str = ReadLine()).c_str(), &err); //Если имеется текст ошибки while (strlen(err) > 0) { //Повтор ввода Write("Ожидается вещественное число: "); val = strtod((str = ReadLine()).c_str(), &err); } //Возврат значения return val;}