Daten aus txt lesen und speichern
-
Hallo,
ich lerne derzeit c++ in der schule und brauch Hilfe bei einer Funktionalität.
Es geht um Orte und die dazugehörenden Postleitzahlen..
Ich will diese in einer struktur speichern die Struktur hat ein int für die plz
und ein char für den Ort
Das textdokument ist folgendermaßen aufgebaut:01067 Dresden
01705 Freital
01877 Schmölln-Putzkau
01983 Großräschen
02748 Bernstadt auf dem Eigen
02959 Groß Düben
...wie kann ich diese Daten aus dem Textdokument lesen und in Arrays der Struktur speichern?
Danke schon mal im Voraus
-
Schau dir mal die IO-Streams und den Eingabe-Operator >> an, damit kannst du so ziemlich alles einlesen, was sich irgendwie interpretieren lässt (und was die Standard-Bibliothek nicht kennt, kannst du dem Compiler auch selber beibringen).
-
http://ideone.com/c5NSY ungetestet.
-
sieht kompliziert aus ....was sind vectoren?^^
-
Die C++ Variante eines Arrays. Siehe auch: http://www.cplusplus.com/reference/stl/vector/
-
Hier gibts auch eine entsprechende Artikelserie: Aufbau der STL
-
noobmaxxe

da hast du dir ja schöne Städtenamen aus gesucht
So schön mit Leerzeichen und nicht nur Buchstaben (-).Das ist schon oft ein Problem bei den Beispielquelltexten. Also genau das richtige zu Testen.
-
Nachtrag: Lese die PLZ auch als String, sonst musst du dir Gedanken über der 0 bei
01967 Dresden machen und brauchst dir auch keinen Kopf machen wie gross int auf deinem System ist, wenn du die PLZ von Nürnberg eingeben willst.MfG f.-th.
-
ja ok .....danke für eure Hilfe, aber bishin bin ich total am scheitern....
ich hab keine ahnung wie ich die sache lesen kann ....
bishin sieht das so aus :int main(){
ifstream text("plz4.txt"); // txt mit den daten
std::string puff;
while(!text.eof())
{
getline(text,puff);
cout << puff << endl;
}
text.close();
system("pause");
}dann hab ich noch ne struktur
struct City
{
int plz[5];
char ort[30];
};in der main wird jetz alles zeilenweise ausgegeben
bis zum ende....habe schon mal so eine einlesefunktion geschrieben, aber bei der war in der text nur eine sache pro zeile.
-

-
Hast du überhaupt irgendeinen der Links hier im Thread überhaupt nur angesehen?
Warum benutzt du an einer Stelle string und an anderer Stelle char-Arrays? Das hast du doch nicht selber so geschrieben, das ist Copy&Paste Programmierung. So wird das garantiert nichts.
edit: So könnte so etwas aussehen, wenn man es etwas besser macht. Es ist mit Absicht so geschrieben, dass dir niemand glaubt, dass du das als Hausaufgabe gemacht hast, aber ich versuche möglichst viele Techniken zu benutzen, die dir was bringen, wenn du sie anguckst:
#include <string> // Kern des Programms #include <fstream> // " #include <vector> // " #include <algorithm> // Für die Ausgabe, siehe unten #include <iterator> // " #include <iostream> // " using namespace std; class City { string name; // Wozu Größenbeschränkung durch char[30]? string zip; // Wozu Beschränkung auf 5 Ziffern? Denk international! friend istream& operator >> (istream &in, City& city) // So sieht eine Einlesefunktion aus. Google "Operatorüberladung" { return getline(in >> city.zip, city.name); // Ok, dies ist Erfahrungssache, aber du siehst, deine Daten kann man auch als schicken Einzeiler einlesen } friend ostream& operator << (ostream &out, City const &city) // Und das gleiche für die Ausgabe { return out << "Postleitzahl: " << city.zip << "\tName: " << city.name; } }; int main() { vector<City> cities; { ifstream input("plz4.txt"); City new_city; // Und so liest man sauber bis zum Ende, ohne das man das Ende doppelt hat: while(input >> new_city) cities.push_back(new_city); } // An dieser Stelle wird input übrigens automatisch geschlossen, ganz ohne close() // Und der Form halber noch eine Ausgabe, die wir mal ein bisschen kürzer schreiben als sonst (das hier musst du nicht verstehen, aber es zeigt, dass die C++-Welt größer ist als du denkst): ostream_iterator<City> out_it (cout,"\n"); copy(cities.begin(), cities.end(), out_it); }Wichtige Sachen die hier benutzt werden:
-
Operatorüberladung kannst du auch hier gut nachlesen: http://www.c-plusplus.net/forum/232010
-
Die ganzen Einlese- und Auslesefunktionen geben immer wieder den Stream selbst zurück und sind dadurch ganz wunderbar schachtelbar (Zeilen 18, 23)
-
Die Standardbibliothek von C++ bietet oftmals sehr viel bessere Alternativen zu den C-Datenstrukturen (vector, string)
-
Die Zeile 37 verdient eine Extra-Auflistung, weil du in deinem Programm einen Fehler machst, den ganz viele Anfänger machen:
-
eof wird gesetzt, nachdem eine Leseaktion über das Dateiende hinaus stattgefunden hat. Wenn du erst auf eof prüfst, dann liest und dann das Gelesene abspeicherst, dann stimmt die Reihenfolge nicht. Wenn das Lesen am Dateiende fehlschlägt, speicherst du nämlich trotzdem irgendetwas ab. Die richtige Reihenfolge ist daher Lesen-Prüfen-Speichern.
-
Wenn die Streams zu einem logischen Ausdruck ausgewertet werden (wie in einer if-Abfrage oder hier in der while-Bedingung), dann geben sie true, wenn alles in Ordnung ist und false, wenn ein Fehlerflag gesetzt ist, wie z.B. eof.
-
Wie oben gesagt, geben Einleseaktionen wie >> den Stream selbst zurück, siehe auch die Definition dieser Funktion in Zeile 16.
-
Die Zeile 37 vereint alle diese Punkte sehr kompakt.
-
Eckige Klammern um die Einleseaktion: Wenn Objekte ihren Gültigkeitsbereich (googlen!) verlassen, dann endet auch ihr Leben und der Destruktor (evtl. Nachschlagen. Kurz: Eine Funktion die das Objekt zerstört) wird aufgerufen. new_city und input existieren nach der schließenden Klammer nicht mehr. Die Klassen der Standardbibliothek räumen hinter sich sauber auf (über ihren Konstruktor) und geben alle ihre Ressourcen automatisch frei. Diese Programmiertechnik ist eng verwandt mit dem was man RAII (unbedingt googlen!) nennt und das solltest du dir selber auch angewöhnen. Meistens braucht man aber gar nichts zu tun (wie hier bei der Klasse City), wenn man selber wiederum nur Basisdatentypen oder Datentypen aus der Standardbibliothek benutzt.
-
Ausgabe am Ende: Viele langweilige Standardaufgaben sind in der Standardbibliothek schon lange gelöst, ein Blick hinein lohnt sich. Das wichtigste sind sicherlich die Containerklassen, aber Wie du siehst, kann man mit ein bisschen Wissen etwas wie eine "Schleife über alle Datenelemente nach cout Ausgeben und zwischen allen Einträgen eine neue Zeile machen" sehr kompakt ausdrücken.
edit2: Ich glaube dieser Beitrag ist fast FAQ-fähig als allgemeine Antwort auf alle Anfängerfragen
.
-
-
Für die Lösungswegaufzeiger

Wenn ihr euch noch an eure Zeit als C++ Anfänger erinnert, hättet ihr mit so einem Beispiel weiterarbeiten können? Das als Ziel wie man das Problem relativ elegant in C++ löst, ist gut dargestellt.Wahrscheinlich sind die Schüler und eventuell auch der Lehrer mit einer solch eleganten und kurzen Lösung überfordert.
Für die Sucher nach Lösungen:
Aber selbst als Anfänger seht euch die Lösung an
Die Kommentare geben euch wichtige Hinweise, ganz egal auf welchem Level ihr eine Lösung angehen wollt.C++ bietet viele Lösungswege einer solchen Aufgabe. Wenn ihr euch für einen Weg entscheidet, versucht den möglichst konsequent zu gehen
Die wilde Mischung von Lösungswegen bereitet euch meist Ärger. Leider sind viele Beiträge im Netz letzteres.MfG f.-th.