Чтение целых чисел из файла и сохранение его в двухмерном векторе
У меня проблема с чтением из файла и сохранением обратно в 2D вектор. Это функция, которая пишет в файл:
void create_input (int num_frames, int height, int width)
{
ofstream GridFlow;
GridFlow.open ("GridDB");
for (int i = 0; i < num_frames; i++)
{
for (int j = 0; j < height; j++)
{
for (int k = 0; k < width; k++)
{
GridFlow << setw(5);
GridFlow << rand() % 256 << endl;
}
}
}
GridFlow.close();
}
Это просто записывает случайное число для каждой строки (высота * ширина * num_frames) количество раз. Как это:
3
74
160
78
15
30
127
64
178
15
107
То, что я хочу сделать, это прочитать обратно из файла и сохранить различные куски файла (ширина * высота) в разных кадрах. Я пытался сделать это, но программа блокирует без каких-либо ошибок:
vector<Frame> movie;
movie.resize(num_frames);
for (int i = 0; i < num_frames; i++)
{
Frame frame;
int offset = i*width*height*6;
vector<vector<int>>tmp_grid(height, vector<int>(width, 0));
ifstream GridFlow;
GridFlow.open ("GridDB");
GridFlow.seekg(offset, GridFlow.beg);
for (int h = 0; h < height; h++)
{
for (int g = 0; g < width; g++)
{
int value;
GridFlow >> value;
tmp_grid[h][g] = value;
}
}
frame.grid = tmp_grid;
movie[i] = frame;
}
Я использовал смещение, которое каждый раз умножается на 6 (число байтов * строка), чтобы начать чтение, структура Frame - это всего лишь двухмерный вектор для хранения значений. Я должен сделать это со смещением, потому что следующим шагом будет выполнение многопоточности, каждый поток, зная номер кадра, должен вычислить правильное смещение, чтобы начать чтение и сохранение.
1 ответ
Предположим, файл выглядит так:
1, 2, 3, 4, 5,
6, 7, 8, 9, 10,
11, 12, 13, 14, 15,
Вот один подход к тому, как вы можете прочитать файл в вектор и вывести его в другой файл:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>
int main()
{
using vvint = std::vector<std::vector<int>>;
std::ifstream file{ "file.txt" };
vvint vec;
std::string line;
while (std::getline(file, line)) {
std::stringstream ss(line);
std::string str_num;
std::vector<int> temp;
while (std::getline(ss, str_num, ',')) {
temp.emplace_back(std::stoi(str_num));
}
vec.emplace_back(temp);
}
std::ofstream out_file{ "output.txt" };
for (const auto& i : vec) {
for (const auto& j : i) {
out_file << j << ", ";
}
out_file << '\n';
}
}