Функция расширения для char * в c ++ не печатает так, как должно быть - PullRequest
0 голосов
/ 11 ноября 2018

Я создал программу на c ++, которая принимает файл и морфинг для применения к нему через командную строку. Но так далеко. Мой алгоритм принимает в файл как:

.............
.............
..XXX.....X..
..XXX.....X..
..XXX........
..XXX........
..XXXXXXX....
..XXXXXXX....
..XXXXXXX....
.............
.............

и распечатывает что-то похожее на это:

.............
..X.X.....X..
.XXXXX...XXX.
..XXX.....X..
.XXXXX.......
..XXX.X.X....
.XXXXXXXXX...
..XXXXXXX....
.XXXXXXXXX...
..X.X.X.X....
.............

Когда нужно распечатать что-то похожее на это:

.............
..XXX.....X..
.XXXXX...XXX.
.XXXXX...XXX.
.XXXXX....X..
.XXXXXXXX....
.XXXXXXXXX...
.XXXXXXXXX...
.XXXXXXXXX...
..XXXXXXX....
.............

Я заставил свою программу пройти через все индексы и проверить, является ли их элемент, который они хотят расширить, затем посмотреть сверху, снизу, слева и справа. Добавить еще одну копию своего индекса в окружающую сетку. Но почему моя программа печатается так?

Вот код, который у меня есть:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
//look up line by line parsing
using namespace std;
void replacee(vector<vector<char>> &vec, char oldd, char neww)
{
    for (vector<char> &v : vec) // reference to innver vector
    {
        replace(v.begin(), v.end(), oldd, neww); // standard library     algorithm
    }
}
void dialationn(vector<vector<char>> &vec, char suspect, char n)
{
    for (int i = 0; i < vec.size(); i ++) {
            for (int j = 0; j < vec[i].size(); j++) {
                if (vec[i][j] == suspect) {
                    if (i > 0) {
                     vec[i-1][j] = n;
                    }
                    if (j > 0) {
                     vec[i][j-1] = n;
                    }
                    if (i + 1<vec.size()) {
                        vec[i+1][j] = n;
                    }
                    if (j + 1<vec[i].size()) {
                        vec[i][j+1] = n;
                    }
                }
            }
        }
        replacee(vec, n, suspect);
}
void erode(vector<vector<char>> &vec, char suspect, char n)
{
    for (int i = 0; i < vec.size(); i ++) {
            for (int j = 0; j < vec[i].size(); j++) {
                if (vec[i][j] == suspect) {
                    if (i > 0) {
                     vec[i-1][j] = n;
                    }
                    if (j > 0) {
                     vec[i][j-1] = n;
                    }
                    if (i + 1<vec.size()) {
                        vec[i+1][j] = n;
                    }
                    if (j + 1<vec[i].size()) {
                        vec[i][j+1] = n;
                    }
                }
            }
        }
        replacee(vec, n, suspect);
}
int main(int argc, char* argv[]) {

    fstream fin; char ch;
    string name (argv[1]); //File Name.
    vector<vector<char>> data;
    // 2D Vector.
    vector<char> temp;
    // Temporary vector to be pushed 
    // into vec, since its a vector of vectors.
    fin.open(name.c_str(),ios::in);
    // Assume name as an arbitary file.
    string argument2 (argv[2]);
    while(fin)
    {
        ch = fin.get();
        if(ch!='\n') {
            temp.push_back(ch);
        }
        else 
        { 
            data.push_back(temp); 
            temp.clear(); 
        }
    }
    if (argument2 == "replace") {
            string argument4 (argv[4]);
            string argument3 (argv[3]);
        replacee(data, argument3[0], argument4[0]);
        for (int i = 0; i < data.size(); i ++) {
            for (int j = 0; j < data[i].size(); j++) {
                cout << data[i][j];
            }
            cout << endl;
        }
    }
    if (argument2 == "dialate") {
        string argument3 (argv[3]);
        dialationn(data, argument3[0], 'i');
        for (int m = 0; m < data.size(); m ++) {
            for (int n = 0; n < data[m].size(); n++) {
                cout << data[m][n];
            }
            cout << endl;
        }
    }

    fin.close();
} 

Основная функция принимает первый аргумент в качестве имени текстового файла для его анализа. Затем он просматривает второй аргумент, чтобы увидеть, что пользователь хочет сделать, а затем, основываясь на аргументе 2, вызывает соответствующую функцию replacee или dialate для применения морфа. После того, как символ *, содержащий файл, был изменен одной из функций, он выводит его на печать.

Примечание: функция dialatee заменяет все символы, которые она считает нужными, на 'i', а затем вызывает функцию replacee, чтобы вернуть их в исходный вывод. Это сделано для того, чтобы функция не могла прочитать уже измененные символы и применить непреднамеренные изменения.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Когда вы нажмете первый «X», вы напишите «i» в пробелы выше, ниже, слева и справа от него, заменив другие «X», которые вы еще не читали.

После вашего первого прохождения вещи, вероятно, будут выглядеть так: ............. ..i.i.....i.. .iXiXi...iXi. ..iXi.....i.. .iXiXi....... ..XiX........ .iXiXiXiXi... ..XiXiXiX.... .iXiXiXiXi... ..i.i.i.i.... .............

Таким образом, когда вы попадаете в точку, которая была переключена с «X» на «i», она не совпадает и не обрабатывается так же.

Легким решением было бы создать новый вектор, и каждый раз, когда вы находите 'X' в исходном векторе, вы помещаете свои 'i' вверх, вниз, влево, вправо и прямо в (в новом векторе) где «Х» будет в вашем исходном векторе. Затем передайте новый, поскольку эффективность не является вашим наивысшим приоритетом. Это позволит избежать проблем с перезаписью при чтении.

0 голосов
/ 11 ноября 2018

Вы перезаписываете свои данные перед их анализом. Перед установкой элемента vec на n убедитесь, что он не suspect.

Проход по коду с хорошим отладчиком должен позволить вам увидеть это.

...