2016-08-01 16 views
0

Ich habe Probleme bei der Codierung und Konzeption dieses Projekts, das mir zugewiesen wurde. Ich habe nach Antworten auf dieses Problem gesucht, aber hatte wenig bis kein Glück, vielleicht ist es wirklich offensichtlich. Ich soll den Benutzer auf einen Dateinamen zu veranlassen, die Datei übernehmen Sie das folgende Format haben:Lesen bestimmter Wörter aus einer Datei und Speichern in einem Objekt

Tier:

Name: [Wert]

Geräusch: [Wert]

Beine: [Wert]

(ohne Leerzeichen dazwischen)

Es sollte in der Lage sein, so viele „Tierobjekte“ zu lesen, wie es in der Datei und speichert sie in eine Tierobjektklasse mit 3 Parametern (Name, Rauschen, Beine).

Mein Problem ist meist während des Einlesens der Datei, ich kann nicht eine gute Methode zum Lesen der Datei und Speichern der Informationen herausfinden. Hier ist der Code, den ich derzeit habe. Irgendeine Hilfe mit dem Code, den ich zurzeit habe und Ideen, um die Werte zu speichern. Tut mir leid, wenn ich etwas schlecht erklärt habe, bitte erkundigen Sie sich, ob ich es tat, vielen Dank im Voraus.

cout << "Enter the file name: "; 
    string fileName; 
    getline(cin, fileName); 
    cout << endl; 
    try 
    { 
     ifstream animalFile(fileName); 
     if (!animalFile.good()) // if it's no good, let the user know and let the loop continue to try again 
     { 
      cout << "There was a problem with the file " << fileName << endl << endl; 
      continue; 
     } 

     string line; 
     while (animalFile >> line) // To get you all the lines. 
     { 
      getline(animalFile, line); // Saves the line in STRING. 
      cout << line << endl; // Prints our STRING. 
     } 

    } 
    catch (...) 
    { 
     cout << "There was a problem with the file " << fileName << endl << endl; 
    } 
+0

Ist es wirklich sinnvoll, das Rad in diesem Fall neu zu erfinden? Erwägen Sie, vorhandene Bibliotheken für xml, json, yaml oder irgendetwas anderes zu verwenden – alexeykuzmin0

Antwort

0

Wenn Sie sich wirklich mit diesem Dateiformat binded, sollten die folgenden Aktionen ausführen, die Daten zu lesen und speichern es:

# 1. Definieren Sie eine Klasse Animal zur Darstellung eines Tieres:

struct Animal 
{ 
    std::string name; 
    int legs; 
    int noise; 
} 

# 2. Definieren Sie eine istream& operator >> (istream&, Animal&), um ein Objekt dieses Typs zu lesen und auf die Korrektheit der Eingabe zu prüfen.

std::istream& operator >> (std::istream& lhs, Animal& rhs) 
{ 
    std::string buf; 
    lhs >> buf >> buf >> rhs.name >> buf >> rhs.noise >> buf >> rhs.legs; 
} 

# 3. Verwenden Sie std::copy und std::istream_iterator alle Werte aus der Datei zu std::vector zu lesen:

std::istream_iterator<Animal> eos; 
std::istream_iterator<Animal> bos(animalFile); 
std::vector<Animal> zoo; 
std::copy(bos, eos, std::back_inserter(zoo)); 

Dieser Code hat keine Prüfung auf Eingabefehler, die sich leicht in istream& operator >> (istream&, Animal&) hinzugefügt werden.

+0

Vielen Dank für Ihre Antwort. Zur Klarstellung: # 2 liest einfach die Datei, um nach dem Format zu suchen, sonst nichts? Auch für # 3, könntest du mir eine Erklärung dafür geben, was für eine Codezeile es tut, ich habe Probleme, es vollständig zu erfassen, obwohl ich weiß, was es tun soll. – Roberto

+0

@Roberto # 2 liest die Daten tatsächlich und gibt sie durch Speichern im Ausgabeargument 'rhs' zurück. Dieser Operator kann wie folgt verwendet werden: 'Tier a; cin >> a; '. – alexeykuzmin0

+0

# 3: 'std :: vector' ist nur ein dynamisches Array von' Animal's. 'istream_iterator ' ist ein Iterator über den 'istream'. Bei der Dereferenzierung gibt es den Wert des Typs "T" zurück, der von dem durch den "Operator >>" gegebenen "istream" gelesen wird, beim Weiterschalten bewegt er sich zum nächsten Element vom Typ "T" im "istream". 'istream_iterator', der ohne Argumente konstruiert wurde, ist" end of stream iterator "- er hat den falschen Status und ist gleich (in Bezug auf" operator == ') zu dem" istream_iterator "fortgeschritten bis er das Ende des Streams erreicht. 'std :: back_inserter' ist ein' std :: back_intert_iterator', der 'push_back()' bei der Zuweisung zu '. – alexeykuzmin0