2016-05-11 13 views
0

Ich habe ein Problem beim Lesen aus einer Datei und beim Speichern in einem 2D-Vektor. Dies ist die Funktion, die auf die Datei schreiben:Ganzzahlen aus einer Datei lesen und in einem 2D-Vektor speichern

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(); 
} 

, die einfach eine Zufallszahl für jede Zeile schreibt (Höhe * Breite * num_frames) Anzahl. Wie folgt aus:

3 
    74 
    160 
    78 
    15 
    30 
    127 
    64 
    178 
    15 
    107 

Was möchte ich tun, ist wieder aus der Datei zu lesen und verschiedene Stücke der Datei (Breite * Höhe) in verschiedenen Rahmen zu speichern. Ich habe versucht, dies ohne Fehler aber die Programmbausteine ​​zu tun:

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

Ich habe ein Offset verwendet, dass jedes Mal um 6 (Anzahl der Bytes * line) multipliziert wird, der Struktur-Rahmen zu lesen beginnt, ist nur ein 2D-Vektor zum Speichern der Werte. Ich muss dies mit dem Offset tun, da der nächste Schritt dieses Multithreading sein wird, jeder Thread, der die Nummer des Frames kennt, sollte den richtigen Offset berechnen, um mit dem Lesen und Speichern zu beginnen.

+0

keine Fehler geworfen, nichts? – Vtik

+0

Off topic: Empfehlen Sie, Binärdatei, nicht Text in die Datei zu schreiben. Viel kleinere Datei (6x), einfacher, Grenzen vorherzusagen (aber Sie haben hier einen großen Job gemacht, Grenzen zu begrenzen), und Sie müssen nicht von Text zu Integer konvertieren. Sollten Sie einen großen Geschwindigkeitsschub bekommen, weil Sie die ganze Datei in einem großen Array von Bytes in einem Schuss saugen und dann das Array unter Threads partitionieren können. – user4581301

+1

Wie auch immer, ein Block oder Busy-Spin sollte ein leichtes Problem sein der Debugger, der mit Ihrer Entwicklungsumgebung geliefert wurde. – user4581301

Antwort

0

Angenommen, die Datei ist wie folgt:

1, 2, 3, 4, 5, 
6, 7, 8, 9, 10, 
11, 12, 13, 14, 15, 

Hier ist ein Ansatz, wie Sie die Datei in einen Vektor und Ausgabe, die es auf eine andere Datei lesen konnte:

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