Создание текстового редактора с использованием deque в C ++ при попытке добавить команду, которая удаляет текущую строку. Но либо сег ошибки, либо не удаляет то, что я хочу - PullRequest
0 голосов
/ 03 ноября 2019

Попытка создать текстовый редактор, который передает файл .txt, который использует точечные команды для редактирования текста. Например. <Перемещает указатель для текущей строки в начало документа, а .p перемещает указатель выше. У меня проблема с имплантированием команды .k, которая должна удалить текущую строку, на которой находится точка. </p>

Текущий код:

#include <fstream>
#include <iostream>
#include <fstream>
#include <string>
#include <deque>
#include <functional>

using namespace std;

int main()
{

    deque<string> page;

    string line;

    deque<string>::iterator linePointer = page.begin();

    int beginCounter = 0;

    int erasor = 0;

    while (getline(cin, line))
    {
        if (page.empty())
        {
            if (line[0] == '.' && line[1] == '.')
                line.erase(0, 1);
            page.push_back(line);
            ++linePointer;
            continue;
        }
        if (line[0] == '.')
        {
            switch (line[1])
            {
            case '.':
                line.erase(0,1);
                page.insert(linePointer, line);
                ++linePointer;  
                continue;

            case '<':
                linePointer = page.begin();
                ++beginCounter;
                continue;

            case '>':
            linePointer = page.end();
                continue;


            case 'p':
            --linePointer;
                continue;


            case 'n':
            if(linePointer == page.end()) continue;
            ++linePointer;

                continue;

            case 'k':
                //erasor = distance( page.begin(), linePointer );
                page.erase(linePointer);
                continue;
            }
        }
        page.insert(linePointer, line);
        if(beginCounter >=1) continue;
        ++linePointer;
    }

    for (int i = 0; i < page.size(); i++){
        string line = page[i];
        cout << line << endl;
    }
}

При попытке проанализировать этот файл:

Made glorious summer by this sun of York;
.<
Delete me!
.p
.k
Now is the winter
of our discontent

Компилятор создает это:

Now is the winter
Delete me!
Made glorious summer by this sun of York;
Aborted (core dumped)

1 Ответ

0 голосов
/ 03 ноября 2019

Я попытался реализовать ваш цикл while здесь. Ключевым моментом является то, что при удалении элемента из вектора, строки или deque итераторы, указывающие на этот элемент и далее (обратите внимание на это!), Становятся недействительными. Однако вы можете использовать возвращаемое значение функции-члена erase, которая является допустимым итератором, указывающим на элемент, следующий за стертым элементом.

Как указано в комментариях к вашему сообщению, это также можно реализоватьиспользуя std :: list. Тем не менее, std :: list может быть дорогим для перемещения вперед и назад в большом файле, так как он не поддерживает итераторы произвольного доступа. Кроме того, удаление элемента из std :: list имеет свои собственные проблемы аннулирования итерации (для этого обратитесь к пункту 9, Эффективный STL, Скотт Мейерс.)

while (getline(ifs, line))
{
    if (line[0] == '.')
    {
        if(page.empty()) continue;

        switch (line[1])
        {
        case '.':
            line.erase(0,1);
            linePointer = page.insert(linePointer, line);
            ++linePointer;
            continue;

        case '<':
            linePointer = page.begin();
            continue;

        case '>':
        linePointer = page.end();
            continue;

        case 'p':
        --linePointer;
            continue;

        case 'n':
        if(linePointer == page.end()) continue;
        ++linePointer;
            continue;

        case 'k':
            --linePointer;
            linePointer = page.erase(linePointer);
            continue;
        }
    }

    linePointer = page.insert(linePointer, line);
    ++linePointer;
}

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

...