2016-03-23 10 views
1

Ich bin mitten in einem College-Projekt, das irgendwie wie eine Studenten-Datenbank aussieht. Jede Zeile der Textdatei folgt dieses „Modell“:C++: cin mit Leerzeichen an Strings ohne getline-Funktion

age ; full_name ; avg 

Ich brauche die Textdatei und speichern Sie alles in einem Vektor von Strukturen zu lesen, und ich konnte das tun, wenn der Name war nur ein Wort. Nun, offensichtlich, Alter ist ein int, avg ist ein Doppel, aber was ist mit dem vollen Namen? Ich kann nicht einfach file >> full_name; verwenden, wobei full_name eine Zeichenfolge ist, weil es aufhören würde, es zu lesen, sobald es zu einem Leerzeichen kommt. Die getline() Funktion würde alles an einem Ort speichern, so dass ich nicht sicher bin, was ich tun soll.

Bitte teilen Sie Ihre WISSEN mit diesem jungen Geist x)

+0

[Stark verwandte] (http://stackoverflow.com/questions/23047052/why-does-reading-a-record-struct-fields -von-stdistream-fail-and-how-can-i-fi). –

+1

'std :: getline' kann ein benutzerdefiniertes Trennzeichen verwenden, diese'; 'sehen aus, als könnten sie nützlich sein :) – melak47

+0

Sehr ähnliches Problem. Aber ich habe nicht verstanden, was die Lösung war. Ich möchte nicht mehr als eine Zeichenfolge für den Namen verwenden, da sie eine variable Anzahl von Wörtern haben kann. Auch das Umordnen der Datei ist keine Option. –

Antwort

1

Wie viele andere darauf hingewiesen, Sie std::getline verwenden können Zeichen, bis ein Trennzeichen zu lesen.

Betrachten Sie diese Code-Snippet als Ausgangspunkt:

int age; 
std::string name; 
double average; 

// ... Open the file which stores the data ... 

// then read every line. The loop stops if some of the reading operations fails 
while (input >> age && 
     std::getline(input, name, ';') &&  // consume the first ; 
     std::getline(input, name, ';') &&  // read the name 
     input >> average) { 
    // do whatever you need with the data read 
    cout << "age: " << age << " name: " << name << " average: " << average << '\n'; 
} 
Verwandte Themen