Проблема с загрузкой двумерного вектора из файла

Мой код должен загрузить двумерный вектор(void loadVector()) 4х4 из файла с названием vector.txt из своего каталога и вывести его в консоль, однако он криво загружается по неизвестной мне причине. Скорее всего, я использую неправильную функцию (мне нужно получать, желательно, символы вместо строк). Может, есть более хороший способ хранения больших двумерных векторов?

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

const int WIDTH = 4, HEIGHT = 4;
vector<vector<char>> a(WIDTH, vector<char>(HEIGHT));


void genVector() {
    for (int i = 0; i < a.size(); ++i) {
        for (int j = 0; j < a.size(); ++j) {
            a[i][j] = '0';
        }
    }
}


void showVector() {
    for (int i = 0; i < a.size(); i++) {
        for (int j = 0; j < a.size(); j++) {
            cout << a[i][j];
        }
        cout << endl;
    }
}


void saveVector() {
    ofstream fout("BigVector/vector.txt");
    for (int i = 0; i < a.size(); ++i) {
        for (int j = 0; j < a.size(); ++j) {
            fout << a[i][j];
        }
        fout << endl;
    }
    
    fout.close();
}

//Проблема здесь
void loadVector() {
    ifstream fin("BigVector/vector.txt");

    int bSize = WIDTH;
    char buff[bSize]; 

    //А именно в этом цикле
    for (int i = 0; i < a.size(); ++i) {
        for (int j = 0; j < a.size(); ++j) {
            fin.getline(buff, bSize);
            a[i][j] = buff[j];
        }
    }
/* оно получает
200
 00
 00
 00
*/
/* должно получить
2000
0300
0010
0004
*/
    fin.close();
}


int main()
{
    loadVector();
    showVector();

    return 0;
}

Ответы (2 шт):

Автор решения: daniel_gabitov

У тебя здесь функция getline вызывается i * j раз. Нужно переписать следующим образом:

void loadVector() {
  ifstream fin("BigVector/vector.txt");

  int bSize = WIDTH;
  char buff[bSize]; 

  
  for (int i = 0; i < a.size(); ++i) {
      fin.getline(buff, bSize);
      for (int j = 0; j < bSize; ++j) {
          a[i][j] = buff[j];
      }
  }
  fin.close();
}

Еще несколько замечаний по коду:

vector<vector<char>> a(WIDTH, vector<char>(HEIGHT))

Перепутаны местами WIDTH и HEIGHT. Ты выделяешь WIDTH ячеек, а затем говоришь, что в каждой ячейке должен лежать вектор длины HEIGHT.

Во вложенном цикле неправильны установлены границы индексов. Правильно написать:

void showVector() {
  for (int i = 0; i < a.size(); i++) {
    for (int j = 0; j < a[i].size(); j++) {
      cout << a[i][j];
    }
    cout << endl;
  }
}

Почему? Дело в том, что a.size() - количество ячеек, а a[i].size() - размер ячейки.

Использовать 'using namespace std' плохая практика. Почитать об этом можно здесь: https://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-bad-practice

→ Ссылка
Автор решения: Shuvi22

Проблема решена. Вместо getline я использую, видимо, по-символьный ввод в временную перемену buff и вставляю в вектор

void loadVector() {
    ifstream fin("BigVector/vector.txt"); //открываю файл(можно и не .txt формат, а свой(к примеру у себя я назвал его .save), откуда будет читаться вектор
    char buff; //временная переменная
    for(int i = 0; i < a.size(); ++i) { //проход по строкам
        for(int j = 0; j < a[i].size(); ++j) { //проход по символам в строке
            fin >> buff; //по-символьный ввод в переменную buff
            a[i][j] = buff; //установка значения из buff в сам вектор
        }

    }
    fin.close(); //закрытие файла
}
→ Ссылка