Программа на С ++ неправильно печатает 2-мерную векторную сетку, но закрывается - PullRequest
0 голосов
/ 11 декабря 2018

Я сейчас пытаюсь разобрать текстовый файл чисел в 2d вектор, который будет изменен позже, но пока с моим кодом.Я получаю это:

845630179
032918654
190745328
683074912
457201836
219863540
361429705
074186093
074186093�845630179

Это хорошо и все, кроме того, что повторяет строку номер 9 и ставит мусор в конце.

Если я ставлю ввод в конце текста, он печатает это:

845630179
032918654
190745328
683074912
457201836
219863540
361429705
074186093
9203574619

(10-й элемент в 9-й строке не должен быть там)

для справки, вот как выглядит текстовый файл:

845630179
032918654
190745328
683074912
457201836
219863540
361429705
074186093
920357461

Это мой код:

int main(int argc, char* argv[]) {
//parsing the textfile.
vector<vector<char>> grid;
fstream fin; char ch;
string name (argv[1]); //File Name.
// 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.
while(fin)
{
    ch = fin.get();
    if(ch!='\n') {
        temp.push_back(ch);
        cout << ch;
    }
    else 
    { 
        grid.push_back(temp); 
        temp.clear(); 
        cout << ch;
    }
}
for (int i = 0; i < grid.size();i++) {
    for (int j = 0; j < grid[i].size();j++) {
        cout << grid[i][j];
    }
}
}

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Одно быстрое решение избавит вас от большинства ваших проблем:

int main()
{
//parsing the textfile.
    vector<vector<char>> grid;
    fstream fin;
    char ch;

    // Hardcoded value. Typing the same thing in over and over while debugging is for suckers.
    string name("data.txt"); //File Name. 
// 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.
    while (fin.get(ch)) // the change: Slightly different get and getting in the loop
                        // condition. If nothing is gotten the loop doesn't enter
                        // solves almost all of the problems.
    {
        if (ch != '\n')
        {
            temp.push_back(ch);
            cout << ch;
        }
        else
        {
            grid.push_back(temp);
            temp.clear();
            cout << ch; 
        }
    }
    for (int i = 0; i < grid.size(); i++)
    {
        for (int j = 0; j < grid[i].size(); j++)
        {
            cout << grid[i][j];
        }
    }
}

output

845630179
032918654
190745328
683074912
457201836
219863540
361429705
074186093
920357461845630179032918654190745328683074912457201836219863540361429705074186093

Это оставляет мусор на конце.Это не мусор.Это ваш фактический результат.Все до

845630179
032918654
190745328
683074912
457201836
219863540
361429705
074186093
920357461

является результатом cout << ch; внутри цикла while, который выполняет сбор.

845630179032918654190745328683074912457201836219863540361429705074186093

На конце есть петли for.Поскольку символ новой строки не был сохранен, он распечатывается как один большой блок цифр.

Чтобы исправить это, мы удалим вывод из цикла while и восстановим строку в цикле for.

int main()
{
//parsing the textfile.
    vector<vector<char>> grid;
    fstream fin;
    char ch;
    string name("data.txt"); //File Name.
// 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.
    while (fin.get(ch))
    {
        if (ch != '\n')
        {
            temp.push_back(ch);
        }
        else
        {
            grid.push_back(temp);
            temp.clear();
        }
    }
    for (int i = 0; i < grid.size(); i++)
    {
        for (int j = 0; j < grid[i].size(); j++)
        {
            cout << grid[i][j];
        }
        cout << '\n'; // 
    }
}

И если мы сделаем это с vector<string>, примерно четверть кода исчезнет.

 int main()
{
//parsing the textfile.
    vector<string> grid;
    fstream fin;
// 2D Vector.
    vector<char> temp;
// Temporary vector to be pushed
// into vec, since its a vector of vectors.
    fin.open("data.txt", ios::in);
// Assume name as an arbitary file.
    string line;
    while (getline (fin, line))
    {
        grid.push_back(line);
        temp.clear();
    }
    for (int i = 0; i < grid.size(); i++)
    {
        for (int j = 0; j < grid[i].size(); j++)
        {
            cout << grid[i][j];
        }
        cout << '\n'; // getline ate the newline. Have to put it back
    }
}
0 голосов
/ 11 декабря 2018

Ваш код хорошо работает для меня.

Если в конце вашего текстового файла есть ввод, он также добавит последний номер в вашу таблицу.В противном случае вам нужно переместить содержимое от temp до grid после цикла while.

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