PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : int Werte mit for-Schleife aus Datei auslesen



The EYE
08-10-2010, 18:07
Hallo!

Ich kämpfe gerade mit der for-Schleife.

Die Aufgabe lautet: int Werte aus einer .txt Datei auslesen und dann auf dem Bildschirm ausgeben.

Mein Problem ist, dass immer nur die erste Zahl ausgelesen wird und ich komme nicht drauf, wie ich mit der for-Schleife auch weitere Werte auslesen kann.

Die Werte sind durch Zeilenumbrüche getrennt und stehen in einer .txt-Datei.

Hier ist mein Code:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
const int anzahl = 3;
float ausgelesene_zahl;
for (int schleifendurchgang_zaehler = 0; schleifendurchgang_zaehler < anzahl; schleifendurchgang_zaehler = schleifendurchgang_zaehler++)
{
ifstream lesen_test;
lesen_test.open("..\\Dateien\\test2.txt");
lesen_test >> ausgelesene_zahl;
cout << endl << "Ausgelesene Zahl: " << ausgelesene_zahl <<endl;
}
lesen_test.close();

return 0;
}

Ja, meine Variablen könnten noch kürzer sein :rolleyes:

Freue mich auf eure Hilfe!

Gruß Max

locus vivendi
08-10-2010, 18:53
Bring mal deinen Quellcode auf einen Stand, der tatsächlich kompiliert. Wahrscheinlich fällt dir dann schon auf, was falsch läuft...

Du hast übrigens noch ein Problem in deinem Schleifenkopf. Den Zähler solltest du nicht so hochzählen, also mit Zuweisung + Inkrement-Operator. Nur inkrementieren reicht.

The EYE
08-10-2010, 19:53
Hey!

Ich hatte den Code gekürzt und dabei etwas vergessen/unterschlagen. So sollte es laufen.

Habe ich dich mit dem Zähler richtig verstanden? Und wenn ja, warum war meine erstere Version nicht so ideal?

Was in meiner for-Schleife passiert ist mir auch klar, leider habe ich die Lösung aber noch nicht erkannt.

Ich habe noch den Pfad der txt geändert, damit man die (nun angehängte) Datei nur in den Programmordner schieben muss.


#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream lesen_test;
const int anzahl = 3;
float ausgelesene_zahl;
for (int schleifendurchgang_zaehler = 0; schleifendurchgang_zaehler < anzahl; schleifendurchgang_zaehler = schleifendurchgang_zaehler + 1)
{
ifstream lesen_test;
lesen_test.open("test2.txt");
lesen_test >> ausgelesene_zahl;
cout << endl << "Ausgelesene Zahl: " << ausgelesene_zahl <<endl;
}
lesen_test.close();


return 0;
}


Gruß Max

msi
08-10-2010, 23:00
schleifendurchgang_zaehler = schleifendurchgang_zaehler++

weißt du was diese zeile macht?

__nichts__, denn
schleifendurchgang_zaehler++ erhöht um schleifendurchgang_zaehler um eins und gibt den alten wert zurück, welcher dann in schleifendurchgang_zaehler gespeichert wrid

locus vivendi
08-10-2010, 23:02
Habe ich dich mit dem Zähler richtig verstanden? Und wenn ja, warum war meine erstere Version nicht so ideal?
Jetzt ist es korrekt. Die erste Version ist nicht in Ordnung gewesen weil C++ es generell nicht erlaubt eine (skalare) Variable in einem Ausdruck mehrfach zu verändern. Manchmal ist es erlaubt, aber nicht da wo du es gemacht hast.


Was in meiner for-Schleife passiert ist mir auch klar, leider habe ich die Lösung aber noch nicht erkannt.
Okay. Du öffnest die Datei jedesmal wieder wenn du die Schleife durchläufst. Verschiebe das Öffnen *vor* die Schleife.

Du solltest übrigens nach Möglichkeit noch Fehlerbehandlung einbauen. Dateiöffnen, Lesen, Schreiben usw... alles kann auch mal schiefgehen.

The EYE
09-10-2010, 06:16
Guten Morgen!

Wenn ich das Öffnen vor die Scheife setze, liest er allerdings nicht mehr die Zahlen aus. Daher: gibt "sinnlose" Zahlen zurück.

Hier mein geänderter Code:


#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream lesen_test;
const int anzahl = 3;
float ausgelesene_zahl;
lesen_test.open("test2.txt");
for (int schleifendurchgang_zaehler = 0; schleifendurchgang_zaehler < anzahl; schleifendurchgang_zaehler = schleifendurchgang_zaehler + 1)
{
ifstream lesen_test;
lesen_test >> ausgelesene_zahl;
cout << endl << "Ausgelesene Zahl: " << ausgelesene_zahl <<endl;
}
lesen_test.close();


return 0;
}

@msi: ++schleifendurchgang_zaehler währe aber auch richtig oder?

Gruß Max

undefined
09-10-2010, 08:54
Ziemlich konfus das ganze ;)
Hier mal ein Beispiel ...


// g++ -W -Wall -g -pedantic -o reader reader.cpp
#include <cstdlib>
#include <iostream>
#include <fstream>

int main()
{
// Anzahl der Schleifendurchläufe
int lines_to_read = 3;
// puffer bereitstellen
float buffer;
// mit ifstream die datei zum lesen öffnen
std::ifstream fp;
fp.open("test2.txt");
// wenn offen ...
if ( fp.is_open() )
{
for (int i = 0; i < lines_to_read; i = i + 1)
{
fp >> buffer;
std::cout << "Ausgelesene Zahl: " << buffer << std::endl;
}
fp.close();
}
else
{
std::cerr << "Konnte Datei nicht öffnen" << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

sommerfee
09-10-2010, 09:22
Die rote Zeile bitte in die Tonne kippen:


#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream lesen_test;
const int anzahl = 3;
float ausgelesene_zahl;
lesen_test.open("test2.txt");
for (int schleifendurchgang_zaehler = 0; schleifendurchgang_zaehler < anzahl; schleifendurchgang_zaehler = schleifendurchgang_zaehler + 1)
{
ifstream lesen_test;
lesen_test >> ausgelesene_zahl;
cout << endl << "Ausgelesene Zahl: " << ausgelesene_zahl <<endl;
}
lesen_test.close();


return 0;
}

The EYE
09-10-2010, 15:54
@ Sommerfee: Super, jetzt läufts =)

@ undefined: Deine Lösung werde ich auch mal studieren!

@ locus vivendi: Mit der Fehlerbehandlung hat du auf jeden Fall Recht.

Danke an alle, die sich hier gemüht haben =)

Gruß Max

anda_skoa
09-10-2010, 17:33
@ Sommerfee: Super, jetzt läufts =)


Nur um zu erklären warum Sommerfees Änderung geholfen hat:

Du hattest zweimal eine Variable mit dem selben Namen, nämlich lesen_test.
Einmal im Hauptkontext von main() und einmal im Kontext der for-Schleife.

Die erste der beiden hattest du durch open() mit einer Datei "verbunden", aber dann die zweite "leere" zum Lesen benutzt.

Bei gleichem Namen gilt immer die lokalere Definition, in diesem Fall also die des for-Body Blocks.

Ciao,
_

The EYE
09-10-2010, 17:59
Ah super ich war diesbezüglich (wie man vllt gemerkt hat ;-)) auch leicht verwirrt.
Aber hier wird einem ja auch mit C++ schnell geholfen.

Hatte erst etwas "Bedenken", da hier so wenig Threads waren.

Bin mir der LaTeX-Sparte vertraut/habe da viele gute Erfahrungen in diesem Forum gemacht :) - schön, dass es auch mit C++ so ist!

Gruß Max