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 |
|
| |