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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2013, 14:20   #1
BigDaddy
Пользователь
 
Регистрация: 23.11.2012
Сообщений: 45
По умолчанию Удержать курсор при использовании cin

Подскажите, пожалуйста.
Кусочек простой программы.
Нужно ввести число от 0 до 20.
Если вводимое число (или текст) не попадает в этот интервал, то просим повторить.
Все работает.
НО!!
Если просто нажимать Enter, то курсор опускается вниз по окну консоли.
Я хочу, чтобы курсор при Enter оставался на позиции с координатой 0 , 9.
Эта позиция подсвечена.

Подскажите, пожалуйста, как не допускать опускания курсора при Enter.

Вот кусочек программки:

Код:
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <string>
#include <conio.h>
#include <ctype.h>
#include <Windows.h> // for color change of text and background

using namespace std;

void gotoxy( int column, int line )
  {
  COORD coord;
  coord.X = column;
  coord.Y = line;
  SetConsoleCursorPosition(GetStdHandle( STD_OUTPUT_HANDLE), coord);  
  }

void SetColor(int text, int background)
{
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleTextAttribute(hStdOut, (WORD)(background << 4 | text));
}

int main(void)

{
int kk;

    setlocale(LC_ALL,"Russian");

    SetColor( 15, 0);
    gotoxy(0,5);
    cout<<"введите чсило от 0 до 20\n";
 
l4:
    kk=-1;
    SetColor( 15, 0);
    gotoxy(0,8);
    cout<<"                                                             ";
    gotoxy(0,9);
    cout<<"                                                             ";
    gotoxy(0,8);
    SetColor( 9, 15);
    cout<<" ";
    gotoxy(0,8);
    cin>>kk;

if ((kk<0) || (kk>20))
{
    SetColor( 15, 0);
    gotoxy(0,9);
    // очищаем буфер ввода cin от ошибки формата, когда ввели текст
    cin.clear(); 
    cin.sync();
           cout<<"неправильно ввели число. введите еще раз";
           getch();
           goto l4;
}           
}
лучше день потерять, а потом за пять минут долететь
BigDaddy вне форума Ответить с цитированием
Старый 07.05.2013, 14:50   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Подскажите, пожалуйста, как не допускать опускания курсора при Enter.

я делал для своей консоли собственный ввод (средствами винапи)

то есть, считывал нажатие клавиш,в соответствии с ними высвечивал на экране буковку, и сдвигал курсор.

(std::cout и std::cin перехватывались за счет сплайсинга (подмена винапи функций для этих механизмов)

- минусы ---- пришлось писать логику для ввода с нуля, основываясь на винапи
- минусы ---- тогдашняя реализация была потоко не безопасной.

- плюсы ---- полный контроль за всем процессом.

Я делал скроллинговые поля (текст уходит за левую границу, если не влазиет в нужное поле)
Или фиксированные (нельзя ввести больше букв, чем может вместить поле)

/зы единственный способ не использовать стандартную логику - подменить её своей собственной.
_Bers вне форума Ответить с цитированием
Старый 07.05.2013, 14:56   #3
BigDaddy
Пользователь
 
Регистрация: 23.11.2012
Сообщений: 45
По умолчанию

извини, не совсем понял

я пробую использовать вместо cin<<kk

kk=getchar();
if (kk==13)
goto l4;

но тогда у меня всегда выдает ошибку, даже когда я набираю 5, которая попадает в диапазон...

еще пока не справился...
лучше день потерять, а потом за пять минут долететь
BigDaddy вне форума Ответить с цитированием
Старый 07.05.2013, 15:05   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от BigDaddy Посмотреть сообщение
извини, не совсем понял

я пробую использовать вместо cin<<kk

kk=getchar();
if (kk==13)
goto l4;

но тогда у меня всегда выдает ошибку, даже когда я набираю 5, которая попадает в диапазон...

еще пока не справился...
Ввод/вывод - это ОС зависимые операции.
Их бизнес-логикой управляет ОС.

Ты можешь получить полный контроль над ними, если будешь взаимодействовать с самой ОС напрямую.

Здесь все, что тебе нужно для консоли:
http://vsokovikov.narod.ru/New_MSDN_...ole/con_fn.htm
_Bers вне форума Ответить с цитированием
Старый 07.05.2013, 18:27   #5
BigDaddy
Пользователь
 
Регистрация: 23.11.2012
Сообщений: 45
По умолчанию

не получается...
если подскажете, буду благодарен
лучше день потерять, а потом за пять минут долететь
BigDaddy вне форума Ответить с цитированием
Старый 08.05.2013, 14:50   #6
BigDaddy
Пользователь
 
Регистрация: 23.11.2012
Сообщений: 45
По умолчанию

все!
сделал!!

не надо cin

надо getline

вот оно решение:

Код:
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <string>
#include <conio.h>
#include <ctype.h>
#include <Windows.h> // for color change of text and background

using namespace std;

void gotoxy( int column, int line )
  {
  COORD coord;
  coord.X = column;
  coord.Y = line;
  SetConsoleCursorPosition(GetStdHandle( STD_OUTPUT_HANDLE), coord);  
  }

void SetColor(int text, int background)
{
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleTextAttribute(hStdOut, (WORD)(background << 4 | text));
}

int main(void)

{
int kk;
string st;

    setlocale(LC_ALL,"Russian");

    SetColor( 15, 0);
    gotoxy(0,5);
    cout<<"введите число 0 до 20\n";
 
l4:

    kk=-1;
    SetColor( 15, 0);
    gotoxy(0,8);
    cout<<"                                                             ";
    gotoxy(0,9);
    cout<<"                                                             ";
    gotoxy(0,8);
    SetColor( 9, 15);
    cout<<" ";
    gotoxy(0,8);
st="";

getline(cin,st);


if (st=="") 
   goto l4;

kk=atoi(st.c_str());


if (kk==0)
   kk=-1;

if ((st=="0") || st=="00")
   kk=0;


if ((kk<0) || (kk>20))
{
    SetColor( 15, 0);
    gotoxy(0,9);
           cout<<"неправильно ввели число. введите еще раз";
           getch();
           goto l4;
}           
}
лучше день потерять, а потом за пять минут долететь
BigDaddy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании темплейта optimator Общие вопросы C/C++ 5 06.10.2011 14:44
Ошибка при использовании ICQClient Mihanches Работа с сетью в Delphi 2 04.10.2010 21:27
Проблема при использовании CreatProcess иннокент Win Api 6 18.08.2010 19:11
Проблемка при использовании регрессии 500_pinguins Microsoft Office Excel 0 16.06.2009 08:17
TStringGrid. Как удержать фокус на ячейке таблицы? ruma Помощь студентам 1 22.10.2007 12:49