Как заставить функцию gotoxy () выбрать узел в списке ссылок, на котором находится курсор? - PullRequest
0 голосов
/ 10 февраля 2019

Я пишу основной текстовый редактор как задание, и у меня возникли проблемы.Я использую связанные списки, и я могу перемещать курсор по списку, но каждый раз, когда я пытаюсь вставить букву (одну букву в узел) между другими, она просто вставляет букву в конец списка.В коде есть и другие ошибки, в общем, они ищут только помощь по этому основному вопросу, но любые предложения приветствуются.

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <fstream>
#include <string>

using namespace std;


class Node

{
public:

    char c;
    Node* next;
    Node* prev;
};



void gotoxy(int x, int y)

{
    COORD pos = { x, y };
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(output, pos);
}


void createNew()

{

    Node* start = nullptr;
    Node* end = nullptr;
    Node* prevNode = nullptr;
    int xcur = 0, ycur = 0;
    char letter = ' ';

    while (letter != 27)
    {
        letter = _getch();
        if (letter == 8) // backspace
        {
            Node *p;
            p = end;
            end = end->prev;
            delete p;
            end->next = nullptr;
            xcur--;

        }

        else if (letter == 57) //save press '9'
        {
            ofstream outdoc;
            outdoc.open("TheEditor.txt");
            Node* save;
            char data;
            save = start;
            while (save->next != nullptr)
            {
                data = save->c;
                outdoc << data;
                save = save->next;
            }
            outdoc.close();

        }

        else if (letter == -32)
        {
            // he pressed right up left or down
            letter = _getch();

            if (letter == 75) //72 is up 75 left 77 right 80 down
                --xcur;

            if (letter == 77)
                xcur++;

            //if (letter == 72)
                //ycur++;
            //if (letter == 80)
                //ycur--;


        }

        else if (letter == 56) //load file
        {
            ifstream indoc;
            string fname;
            cout << "Please enter the name of the file" << endl;
            cin >> fname;
            indoc.open(fname);
            char file[sizeof(indoc)];
            for (int j = 0; j < sizeof(fname); j++)

            {
                indoc >> file[j];
                cout << file[j];
                j++;
            }

        }

        else if (letter == 13) // enter

        {

            xcur = 1;
            ycur++;
            //start = arr[ycur];

        }



        else // normal eltter

        {

            Node* p;
            p = new Node();
            p->c = letter;
            p->next = nullptr;
            p->prev = nullptr;
            if (start == nullptr)
            {
                start = p;
                end = p;
                prevNode = p;
            }

            else if (end->next != nullptr) // insert in middle
            {
                Node* m = new Node();
                m->next = end;
                m->c = letter;
                m->prev = prevNode;
                end->prev = m;
                prevNode = m;


            }

            else

            {
                p->prev = prevNode;
                end->next = p;
                end = p;
                prevNode = p;
            }

            //xcur++;

        }

        system("cls");
        // display your linked list here.
        Node *p;
        p = start;
        while (p != nullptr)
        {
            _putch(p->c);
            p = p->next;
        }
        gotoxy(xcur, ycur);

    }

}



void loadFile()
{
    string fname;
    ifstream indoc;
    cout << "Please enter the name of the document" << endl;
    cin >> fname;
    system("CLS");
    indoc.open(fname);
    Node* start = nullptr;
    Node* end = nullptr;
    Node* prevNode = nullptr;
    int xcur = 0, ycur = 0;
    char letter = ' ';
    char file[sizeof(indoc)];
    for (int j = 0; j < sizeof(fname); j++)

    {
        indoc >> file[j];
        cout << file[j];
        j++;
    }

    indoc.close();

    while (letter != 27)

    {

        _putch(letter);
        if (start == nullptr)

        {
            Node* p;
            p = new Node();
            p->c = letter;
            p->next = nullptr;
            p->prev = nullptr;
            start = p;
            end = p;
            prevNode = p;
        }

        else

        {
            Node* t;
            t = new Node();
            t->c = letter;
            t->next = nullptr;
            t->prev = prevNode;
            end->next = t;
            end = t;
            prevNode = t;
        }

        letter = _getch();


        if (letter == 57) //save press '9'
        {
            ofstream outdoc;
            outdoc.open("RereTheEditor.txt");
            Node* save;
            char data;
            save = start;
            while (save->next != nullptr)
            {
                data = save->c;
                outdoc << data;
                save = save->next;
            }

            outdoc.close();

        }

    }
}



int main()
{
    int choice;
    cout << "Welcome to theEditor 2.0!\n"
        << "Please select an option\n"
        << "1. Create New\n"
        << "2. Load File" << endl;

    cin >> choice;
    system("CLS");
    switch (choice)
    {
    case 1: { createNew(); }
            break;
    case 2: { loadFile(); }
            break;
    }
    return 0;

}

1 Ответ

0 голосов
/ 12 февраля 2019

Вы должны записать соответствующие координаты курсора в каждом узле, прежде чем сможете пройти через него.

class Node
{
public:
    char c;
    COORD pos;
    Node* next;
    Node* prev;
    void setpos(int x, int y)
    {
        pos.X = x;
        pos.Y = y;
    }
};

Получить текущие координаты курсора bInfo.dwCursorPosition с помощью GetConsoleScreenBufferInfo :

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo(hOut, &bInfo);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...