2016-05-14 7 views
2

Ich habe C# und Java verwendet, daher bin ich es gewohnt, eine Eingabedatei zu öffnen und bis zum Ende des Dateistreams zu lesen, während in jeder Zeile eine Art .split verwendet wird mit dem Trennzeichen als Tabulator, Komma, usw., um die einzelnen Werte zu erhalten ODER die spezifische Anzahl von Zeichen für jeden Wert zu extrahieren. Ich begann vor kurzem eine C++ Klasse und hat keine Probleme mit den Aufgaben habe bisher, weil sie meistens Konsole Eingabe/Ausgabe verwenden, aber ich finde es ziemlich schwierig, Daten aus einer Datei zu extrahieren:C++ Parsen einer Eingabedateizeile in ein Array von Objekten

struct Student{ 
    string _fullName[50]; 
    int _grade; 
    float _avg; 
}; 

int main(){ 

    Student students[30]; 

    ifstream inputFile; 
    inputFile.open("file.txt"); 
    if (inputFile.is_open()){ 
     int i = 0; 

     char data[100]; 
     while (inputFile.getline(data, 100)){ 
      //need to split the data by \t and properly convert it into an int/string/float where needed 
     } 

    } 
    system("pause"); 
    return 0; 
} 

Ich überlegte, den getline-Begrenzer auf \ t zu setzen und jeden Wert auf diese Weise zu setzen (dh i nach den 3 Eigenschaften auf 0 zurückzusetzen), aber das funktioniert nicht, wenn einer der Zeilen ein Wert fehlt. In dieser kleinen Aufgabe spielt das keine Rolle, aber ich versuche, das richtig und effizient zu machen. Was ist der effizienteste Weg, um die Daten in jeder Zeile zu extrahieren und korrekt in den entsprechenden Datentyp zu zerlegen?

Hinweis: Ich sollte an dieser Stelle keine Vektoren oder Algorithmen verwenden.

+3

„Ich bin nicht an diesem Punkt werden unter Verwendung von Vektoren oder Algorithmen soll . " klingt wie Sie haben einen dieser Lehrer, die glauben, dass eine C++ - Klasse mit C, nicht C++ beginnen sollte. Schade. Das ist nicht so, wie C++ gelehrt werden sollte. für mehr: https://www.youtube.com/watch?v=YnWhqhNdYyk – johnbakers

Antwort

1

Ich würde empfehlen stringstream. Du verwendest bereits Standard-Streams, also glaube ich nicht, dass es off-topic wäre (und wenn es so aussieht, solltest du deinen eigenen String-Splitter schreiben). stringstream funktioniert genau wie ifstream aber es liest aus einem Speicherpuffer anstelle von Datei:

#include <sstream> 
// ... 

char data[100]; 
while (inputFile.getline(data, 100)){ 
    std::stringstream lineStream(data); 
    while (lineStream >> data) { 
    // now you have a token (space-delimeted) in 'data' 
    } 
} 

können Sie auch split by commas und beliebige Trennzeichen mit getline

+0

Ist es besser, 'std :: string' anstelle von' char data [100] 'zu verwenden:' getline (inputFile, str); ' –

+0

@DmitriyZapevalov Ja, absolut - 'std :: string' ist besser als manuelle Speicherverwaltung. Ich habe nicht bemerkt, dass es in der ursprünglichen Frage bereits eine "Zeichenfolge" gibt. – yeputons

+0

Ich ersetzte 'char Daten [100]' durch 'string data', aber ich sollte keine andere Variable wie' string temp' erzeugen und 'lineStream >> data' durch lineStream >> temp ersetzen, um die Daten seit Daten zu lesen speichert die gesamte Zeile? Ich habe das getan und es scheint zu funktionieren, aber ich wollte sicherstellen, dass ich dein Beispiel nicht falsch verstehe. –