Одно быстрое решение избавит вас от большинства ваших проблем:
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
}
}