Anzeige:
Ergebnis 1 bis 11 von 11

Thema: int Werte mit for-Schleife aus Datei auslesen

  1. #1
    Registrierter Benutzer Avatar von The EYE
    Registriert seit
    15.12.2008
    Ort
    Hameln
    Beiträge
    332

    int Werte mit for-Schleife aus Datei auslesen

    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:
    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

    Freue mich auf eure Hilfe!

    Gruß Max
    ¹: Erstelle bitte ein richtiges Minimalbeispiel
    ²: Ich nutze Ubuntu 14.04, TeX Live 2014 & Kile 2.1.3

  2. #2
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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.

  3. #3
    Registrierter Benutzer Avatar von The EYE
    Registriert seit
    15.12.2008
    Ort
    Hameln
    Beiträge
    332

    Post

    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.

    Code:
    #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
    ¹: Erstelle bitte ein richtiges Minimalbeispiel
    ²: Ich nutze Ubuntu 14.04, TeX Live 2014 & Kile 2.1.3

  4. #4
    Registrierter Benutzer
    Registriert seit
    14.01.2002
    Beiträge
    657
    Code:
    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

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    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.

  6. #6
    Registrierter Benutzer Avatar von The EYE
    Registriert seit
    15.12.2008
    Ort
    Hameln
    Beiträge
    332
    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:

    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
    ¹: Erstelle bitte ein richtiges Minimalbeispiel
    ²: Ich nutze Ubuntu 14.04, TeX Live 2014 & Kile 2.1.3

  7. #7
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Ziemlich konfus das ganze
    Hier mal ein Beispiel ...
    PHP-Code:
    // 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 0lines_to_read1)
        {
          
    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;

    Geändert von undefined (09-10-2010 um 09:57 Uhr) Grund: Schlechtschreibung
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  8. #8
    Registrierter Benutzer Avatar von sommerfee
    Registriert seit
    02.07.2006
    Beiträge
    1.603
    Die rote Zeile bitte in die Tonne kippen:

    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;
    }

  9. #9
    Registrierter Benutzer Avatar von The EYE
    Registriert seit
    15.12.2008
    Ort
    Hameln
    Beiträge
    332
    @ 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
    Geändert von The EYE (09-10-2010 um 17:05 Uhr)
    ¹: Erstelle bitte ein richtiges Minimalbeispiel
    ²: Ich nutze Ubuntu 14.04, TeX Live 2014 & Kile 2.1.3

  10. #10
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von The EYE Beitrag anzeigen
    @ 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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  11. #11
    Registrierter Benutzer Avatar von The EYE
    Registriert seit
    15.12.2008
    Ort
    Hameln
    Beiträge
    332
    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
    ¹: Erstelle bitte ein richtiges Minimalbeispiel
    ²: Ich nutze Ubuntu 14.04, TeX Live 2014 & Kile 2.1.3

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •