2016-05-11 1 views
0

У меня проблема с чтением из файла и сохранением в 2D-векторе. Это функция, писать на файл:Чтение целых чисел из файла и сохранение его в 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 (количество байт * строки), чтобы начать чтение, кадровая структура только 2D-вектор для хранения значений. Я должен сделать это со смещением, потому что следующий шаг будет выполнять эту многопоточность, каждый поток знает, что число кадров должно вычислять смещение вправо, чтобы начать чтение и хранение.

+0

без ошибок, брошенные, ничего? – Vtik

+0

Off topic: Рекомендуем писать двоичные файлы, а не текст в файл. Значительно меньший файл (6x), легче прогнозировать границы (но вы отлично справились с этой задачей, ограничивая границы), и вам не придется преобразовывать текст в целое. Должно получиться большое ускорение скорости, потому что вы можете сосать весь файл в один большой массив байтов за один снимок, а затем разбить массив на потоки. – user4581301

+1

В любом случае, блок или занятый спин должны быть легкой проблемой для обнаружения отладчик, который пришел с вашей средой разработки. – user4581301

ответ

0

Предположим, что файл выглядит так:

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'; 
    } 
}