Проблема с загрузкой двумерного вектора из файла
Мой код должен загрузить двумерный вектор(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 шт):
У тебя здесь функция 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
Проблема решена. Вместо 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(); //закрытие файла
}