Воскресенье, 28 Апреля 2024, 07:19

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Консольный текстовый редактор (Не обрабатываются стрелки)
Консольный текстовый редактор
rayman30011Дата: Среда, 30 Марта 2016, 12:24 | Сообщение # 1
был не раз
Сейчас нет на сайте
Пробую сделать консольный текстовый редактор. Возникло 2 проблемы
1)При старте выбираю "Создать новый файл", переменная isNewfile = true, а при сохранении каким то чудом она становится false.
2)Не работают стрелки. Не "видит" код группы.
Кто может помочь?
Код

#include <iostream>
#include <fstream>
#include <conio.h>
#include <Windows.h>

#pragma warning(disable : 4996)

using namespace std;

enum Color
{
    Black,
    Blue,
    Green,
    Aqua,
    Red,
    Violet,
    Yellow,
    White
};

enum Key
{
    F1 = 59,
    F2 = 60,
    F3 = 61,
    F4 = 62,
    F5 = 63,
    F6 = 64,
    F7,
    F8,
    F9,
    Esc = 27,
    Backspace = 8,
    Enter = 13,
    ArrowUp = 72,
    ArrowDown = 80,
    ArrowLeft = 75,
    ArrowRight = 77
};

void SetColor(WORD wAttributes);
void SetPosition(int x, int y);

struct Data
{
    char area[24][79];

    Color areaColor[24][24];
    COORD cursor;
    Color currentColor;

    void Init()
    {
  for (int y = 0; y < 24; y++)
  {
   for (int x = 0; x < 79; x++)
   {
    areaColor[y][x] = White;
    area[y][x] = ' ';
   }
  }

  cursor.X = 0;
  cursor.Y = 0;

  currentColor = White;
    }

    void Draw()
    {
  for (int y = 0; y < 24; y++)
  {
   for (int x = 0; x < 79; x++)
   {
    SetPosition(x, y);
    SetColor(areaColor[y][x]);
    cout << area[y][x];
   }
  }
    }
};

void ShowInfo();
void Save(bool &newFile, Data &data, char* fileName);
void SaveToFile(Data &data, char *fileName);
void SaveToFile(Data &data);

int main()
{
    setlocale(LC_ALL, "RUSSIAN");

    bool isNewFile;

    char key;
    char fileName[20];
    Data data;
    ifstream file;

    while (true)
    {
  cout << "Создать новый файл?(y/n):";
  cin >> key;
  if (key == 'y' || key == 'n')
   break;
    }
    
    if (key == 'n')
    {
  isNewFile = false;
  cout << "Название файла:";
  cin >> fileName; //cin.getline - криво работал
  file.open(fileName, ios::binary);
  file.read((char*)&data, sizeof(Data));
  file.close();
    }
    else if (key == 'y') // На всякий случай
    {
  isNewFile = true;
  data.Init();
    }

    system("cls");

    while (true)
    {
  
  key = _getch();
  
  //-----------------------------------------------------------------
  //       F1 - F9
  //-----------------------------------------------------------------
  if (key == 0)
  {
   key = _getch();

   switch (key)
   {
   case F1:
    ShowInfo();
    system("cls");
    data.Draw();
    break;
   //------------------------------------------
   // Цвета
   //------------------------------------------
   case F2: data.currentColor = Blue;  break;
   case F3: data.currentColor = Green;  break;
   case F4: data.currentColor = Aqua;  break;    
   case F5: data.currentColor = Red;  break;
   case F6: data.currentColor = Violet; break;
   case F7: data.currentColor = Yellow; break;
   case F8: data.currentColor = White;  break;
   //------------------------------------------
   // Сохранение
   //------------------------------------------
   case F9: system("cls");
    Save(isNewFile, data, fileName);
   default:
    break;
   }
  }
  //-----------------------------------------------------------------
  //       Стрелки
  //-----------------------------------------------------------------
  else if (key == 224)
  {
   key = _getch();
   switch (key)
   {
   case ArrowUp:  data.cursor.Y--; break;
   case ArrowDown:  data.cursor.Y++; break;
   case ArrowLeft:  data.cursor.X--; break;
   case ArrowRight: data.cursor.X++; break;
   default:
    break;
   }
  }
  else
  {
   switch (key)
   {
   case Esc:
    SetColor(White);
    SetPosition(24, 0);
    cout << "Сохранить измемения?(y/n):";
    cin >> key;

    if (key == 'y')
    {
     system("cls");
     Save(isNewFile, data, fileName);
    }
    else
     return 0;
    break;
   case Backspace:
    data.cursor.X--;

    if (data.cursor.X < 0)
    {
     data.cursor.X = 79;
     data.cursor.Y--;
    }
    data.area[data.cursor.Y][data.cursor.X] = ' ';
    SetPosition(data.cursor.X, data.cursor.Y);
    cout << ' ';
    break;
   case Enter:
    data.cursor.Y++;
    data.cursor.X = 0;
    break;
   default:
    SetPosition(data.cursor.X, data.cursor.Y);
    SetColor(data.currentColor);
    data.cursor.X++;
    cout << key;
    break;
   }
  }

  //----------------------------------------
  // Типа Update
  //----------------------------------------
  if (data.cursor.X > 79)
  {
   data.cursor.X = 0;
   data.cursor.Y++;
  }
  if (data.cursor.X < 0)
  {
   data.cursor.X = 79;
   data.cursor.Y--;
  }

  if (data.cursor.Y > 24)
   data.cursor.Y = 24;
  if (data.cursor.Y < 0)
   data.cursor.Y = 0;

  data.area[data.cursor.Y][data.cursor.X] = key;
  data.areaColor[data.cursor.Y][data.cursor.X] = data.currentColor;
    }

    system("pause");
    return 0;
}

void ShowInfo()
{
    system("cls");
    SetColor(White);
    cout << "Изменение цвета\n"
  << "F2)Белый\n"
  << "F3)Синий\n"
  << "F4)Зеленый\n"
  << "F5)Голубой\n"
  << "F6)Красный\n"
  << "F7)Лиловый\n"
  << "F8)Желтый\n\n"
  << "F9) Сохранить\n";

    system("pause");
    system("cls");
}

void SetColor(WORD wAttributes)
{
    HANDLE hOUTPUT = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hOUTPUT, wAttributes);
}

void SetPosition(int x, int y)
{
    COORD dwCursorPosition;
    dwCursorPosition.X = x;
    dwCursorPosition.Y = y;

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), dwCursorPosition);
}

void SaveToFile(Data &data)
{
    char fileName[20];
    cout << "Имя файла: ";
    cin >> fileName;
    ofstream file(fileName, ios::binary);
    file.write((char*)&data, sizeof(Data));
    file.close();
}

void SaveToFile(Data &data, char *fileName)
{
    ofstream file(fileName, ios::binary);
    file.write((char*)&data, sizeof(Data));
    file.close();
}

void Save(bool &newFile, Data &data, char* fileName)
{
    system("cls");
    if (newFile)
  SaveToFile(data);
    else
  SaveToFile(data, fileName);
}
TymonrДата: Среда, 30 Марта 2016, 14:28 | Сообщение # 2
With OpenSource forever
Сейчас нет на сайте
Со стрелками - бери пример с VIM, юзай hjkl)
По поводу нового файла - крути просто пошагово состояния, найдешь где перескакивает


Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы.
Как правильно задавать вопросы в технических форумах
GudleifrДата: Среда, 30 Марта 2016, 15:53 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
rayman30011, ну, как бы тут две проблемы.
1. Почему не работает? Поставьте во все места отладочную печать.
2. Куда ставить отладочную печать? Для этого надо разбить программу на логически-связанные фрагменты. Тут главное перейти Рубикон между "У них так и оно работает" и "Зачем они это сделали и работает ли оно так, как они хотели".
P.S. В любом случае решите, на чем вы пишете, на C или C++.
P.P.S. И, независимо от языка, ф-я длиннее 20-и строк - это неправильная ф-ия.


Быдлокодеры любят повторять: "логика, убивающая мозг",- когда их пытаются заставить программировать.

Сообщение отредактировал Gudleifr - Среда, 30 Марта 2016, 16:09
Форум игроделов » Программирование » C/C++ » Консольный текстовый редактор (Не обрабатываются стрелки)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг