2016-04-05 16 views
0

Die Eingabedatei:Lesen einer Eingabedatei und Speichern der Daten in einem Array (Anfänger)!

1 4 red 
2 0 blue 
3 1 white 
4 2 green 
5 2 black 

, was ich will ist, jede Zeile tun nehmen und speichern Sie es in 2D-Array. zum Beispiel:

array[0][0] = 1 
array[0][1] = 4 
array[0][2] = red 
array[1][0] = 2 
array[1][1] = 0 
array[1][2] = blue 
etc.. 

Code Iam arbeiten daran:

#include <iostream> 
    #include <fstream> 
    #include <string> 
    #include <sstream> 
    #include <vector> 

    using namespace std; 

    int convert_str_to_int(const string& str) { 
     int val; 
     stringstream ss; 
     ss << str; 
     ss >> val; 
     return val; 
    } 


    string getid(string str){ 

     istringstream iss(str); 
     string pid; 
     iss >> pid; 
     return pid; 
    } 
    string getnumberofcolors(string str){ 
     istringstream iss(str); 
     string pid,c; 
     iss >> pid>>c; 
     return c; 
    } 

    int main() { 
     string lineinfile ; 
     vector<string> lines; 

     ifstream infile("myinputfile.txt"); 
     if (infile) { 
      while (getline(infile , lineinfile)) { 
      lines.push_back(lineinfile); 
      } 
     } 
     //first line - number of items 
     int numofitems = convert_str_to_int(lines[0]); 

     //lopps items info 
     string ar[numofitems ][3]; 
     int i = 1; 

     while(i<=numofitems){ 
      ar[i][0] = getid(lines[i]); 
      i++; 
     } 
     while(i<=numofitems){ 
      ar[i][1] = getarrivel(lines[i]); 
      i++; 
     } 

     infile.close() ; 
     return 0 ; 
    } 

wenn ich den zweiten hinzufügen, während Schleife aus irgendeinem Grund funktioniert mein Programm gestoppt! gibt es einen anderen Weg zu diesem oder eine Lösung für mein Programm, um es zu beheben.

Antwort

0

Es ist besser, Sie zu zeigen, wie es geht viel besser:

#include <fstream> 
#include <string> 
#include <vector> 

using namespace std; 

int main() { 
    ifstream infile("myinputfile.txt"); // Streams skip spaces and line breaks 

    //first line - number of items 
    size_t numofitems; 
    infile >> numofitems; 

    //lopps items info 
    vector<pair<int, pair<int, string>> ar(numofitems); // Or use std::tuple 

    for(size_t i = 0; i < numofitems; ++i){ 
     infile >> ar[i].first >> ar[i].second.first >> ar[i].second.second; 
    } 

    // infile.close() ; // Not needed -- closed automatically 
    return 0 ; 
} 

Sie sind wahrscheinlich eine Art einfache algorithmische Aufgabe zu lösen. Schauen Sie sich std::pair und std::tuple an, die nicht nur als Container für zwei Elemente nützlich sind, sondern aufgrund ihrer natürlichen Vergleichsoperatoren.

0

Die Antwort ist in der Tat eine viel bessere Lösung als Ihre. Ich dachte, ich sollte einige Ihrer Designfehler aufzeigen und einige Tipps geben, um es zu verbessern.

  • Sie neu definiert eine Funktion, die bereits im Standard vorhanden ist, die std::stoi() ist eine Zeichenkette in eine Ganzzahl umgewandelt. Denken Sie daran, wenn eine Funktion bereits existiert, ist es OK, es wieder zu verwenden, denken Sie nicht, dass Sie neu erfinden müssen, was bereits erfunden ist. Wenn Sie nicht sicher sind, suchen Sie in Ihrem Lieblings-C++ - Referenzhandbuch.
  • Die Lösung speichert die Daten "wie sie sind", während Sie sie als vollständige Zeichenfolge speichern. Das macht keinen Sinn. Sie wissen, was die Daten sind, nutzen Sie das zu Ihrem Vorteil. Wenn Sie eine solche Datenzeile speichern, müssen Sie sie analysieren, konvertieren und dann konstruieren, bevor Sie sie verwenden können, während die Daten in der Lösung nur einmal erstellt werden.
  • Da das Format der Daten im Voraus bekannt ist, besteht eine noch bessere Möglichkeit zum Laden der Informationen darin, eine Struktur zusammen mit Eingabe-/Ausgabeoperatoren zu definieren. Dies würde in etwa so aussehen:

    struct MyData 
    { 
        int   num1; 
        int   num2; 
        std::string color; 
    
        friend std::ostream& operator << (std::ostream& os, const MyData& d); 
        friend std::istream& operator >> (std::istream& os, const MyData& d); 
    }; 
    

    Dann könnte man einfach etwas tun:

    ... 
    MyData tmp; 
    outfile << tmp; 
    vData.push_back(tmp); 
    ... 
    

    Sie ist keine Frage des Vorsatzes, sind wir offensichtlich einen Datentyp aus einem Stream zu lesen und zu speichern es in einem Behälter. Wenn überhaupt, ist es klarer, was Sie tun, als entweder Ihre ursprüngliche Lösung oder die zur Verfügung gestellte.