[C/C++] Werte aus einer TXT Datei auslesen

wurstmuffin

Lt. Commander
Registriert
Nov. 2005
Beiträge
1.865
Hallo.
Ich würd gern float Werte aus einer TXT Datei einlesen und diese zB in einem Array abspeichern. Ich habe zwar schon C/C++ ein wenig programmiert, aber bisher nie aus auf Dateien eingelesen. Ich hänge die Beispieldatei dran. Die Werte sind alle in einer Zeile gespeichert und sind durch Semikolon getrennt. Es sind eigentlich genau 10 float Werte.
Hat einer ne Idee wie das geht?
Ich habe vieles ergoogelt, aber bisher keine brauchbaren Beispiele gesehen :baby_alt:
 

Anhänge

Zuletzt bearbeitet:
Hmm auch wenn das Thema hier schon ein bischen älter ist, ich bin auch gerade auf der Suche nach der Lösung für das gleiche Problem und diese 2 Antworten sind mal sowas von überhaupt nicht hilfreich... habt ihr euch überhaupt die Frage durchgelesen ? mal die Datei geöffnet ? anscheinend nicht.
Denn auf keinen eurer beiden Links ist eine Lösung bzw. etwas hilfreiches für das Problem zu finden.

Eigentlich traurig dass das so weit oben bei google steht.

So, hat den irgendjemand anders eine Lösung für das Problem ?
Ergänzung ()

Und ich will hier ja auch nicht nur rumjammern sondern habe auch eine funktionierende hilfreiche Lösung gefunden ...

http://www.gidforums.com/t-18285.html
 
huhu lerne gerade c++ in der berufsschule und bin echt kein experte aber wir haben sowas ähnliches neulich gemacht.

du brauchst ne funktion names ifstream die du am anfang mit #include <fstream> includierst.
mit der fuktion liest du dann zeile für zeile aus einer text datei werte aus.
diese speicherst du erstmal in ein string array.
danach ne schöne for schleife mit der du die einzelnen strings im array in zahlen datentypen umwandelst.

code beispiel bekomm ich gerade nicht zusammen.

aber "ifstream datei einlesen c++" bei google gibts einige code beispiele auch wenn die etwas verwirrend sind wie ich finde.

hoffe ich konnte etwas helfen

liebe grüße
flode
 
ifstream ist keine Funktion!

Es empfiehlt sich, die Datei beim Einlesen zu prüfen, hier aber die einfachste Variante:
ifstream infile; //Eingabestream (ungebunden)
infile.open("Pfad/Dateiname");

Dann prüfst du, ob das einlesen erfolgreich war (wieder einfachste Möglichkeit):
if (!infile)
{
cerr<<"Konnte die Datei nicht einlesen: "<<infile<<endl;
return -1;
}
Soweit so gut.
Wenn du dann in dein Array einlesen willst, würde ich dir vorschlagen, du solltest lieber einen sequentiellen Container (z. B. vector nutzen).
float number;
vector<float> fvec;
while (infile>>number)
fvec.push_back(number);

Sollte das ganze einlesen bis entweder falsche Eingabe (kein float) bzw. das Ende der Datei erreicht ist (EOF).

Das sind alles keine sonderlich intelligenten Lösungen, aber es sollte funktionieren.

Gruß,

badday
 
Soweit mir bekannt ist, prüft der Operator ! bei einem ifstream ob badbit oder failbit gesetzt ist.
Und soweit ich weiß, passt das mit der while schleife auch.

Ich lasse mich gerne eines besseren belehren (und noch lieber bestätigen).

Gruß,

badday
 
Das mit der while-Schleife sollte aber funktionieren, da der Operator>> meines Wissens nach auch nach Status-Bits prüft...
Dachte ich jedenfalls.

Gruß,

badday
 
Blitzmerker schrieb:
if(!infile) wird nie eintreten, die Klasse wird ja erstellt.
Was möchtest du damit sagen? Versteh ich nicht.

Blitzmerker schrieb:
Besser:
if(infile.bad())
Warum nicht auch das Failbit prüfen? Ich sehe keinen Grund, warum ein frisch geöffneter Stream das Failbit gesetzt haben sollte.
if(!infile) macht schon alles richtig - nämlich fail() aufrufen, was wiederum badbit und failbit prüft - ist eins von beiden gesetzt, kommt true zurück.

Blitzmerker schrieb:
und das while
for(;!infile.eof();infile>>number)
fvec.push_back(number);
Da sind prompt zwei Bugs drin.

Nr 1: Endlosschleife
Kann operator>> keine Zahl extrahieren, wird das Failbit gesetzt und die Folgeaufrufe von operator>> sind ein No-Op. Die Abbruchbedingung prüft aber auf eof() und würde dann endlos laufen.

Nr 2.: Letzte Zahl wird vergessen, wenn EOF direkt hinter der Zahl ist
Dann extrahiert operator>> nämlich die Zahl, stößt auf EOF und merkt, dass er aufhören kann zu parsen, legt das Ergebnis in number ab und setzt das Eof-Bit. Das Extrahieren war also erfolgreich, aber dein EOF-Test ignoriert das.

Beides kann ganz einfach korrigiert werden:
while (infile >> number)

Also das, was badday schon geschrieben hat.

Gruß
 
Ein frisch geöffneter Stream auf eine ungültige Datei?
Und ich hab schon geschrieben, dass der operator! es auch testet und auch geht.
Zu Nr1:
Dann nehm infile.bad()
Zu Nr2:
Warum wird ne Zahl vergessen?

Also über das Safe Bool Idom kann man es natürlich so schreiben, aber es kann auf den ersten Blick sehr verwirren. Ich habs auch erst jetzt ganz verstanden, welche Operatoren durch den Aufruf alle benutzt werden. Ich war halt ein bischen zu stark auf Pointer fixiert, weil ich zur Zeit praktisch nur mit diesen Jonglieren muss. (Und da ist ein if() sofort eine Abfrage der Adresse).
 
Zu Nr 1:
Bad wäre auch falsch. fail() macht's richtig.

Zu 2:
Die letzte Zeile in der Datei:
123*
Wobei * EOF darstellen soll. operator>> liest 1, 2, 3 und trifft dann auf EOF. Die gelesene Zahl wird erfolgreich extrahiert und das EOF-Bit im Stream gesetzt. Wenn deine Schleife nun auf EOF als Abbruchbedingung hat, liest sie den letzten Wert nicht mehr ein (bzw. führt das push_back nicht aus).
Im übrigen setzt das nächste Lesen dann das Failbit, weil nichts mehr extrahiert werden konnte, und beendet damit dann das Auslesen, wenn man es so wie von badday vorgeschlagen macht.
 
Zurück
Oben