Problem mit einlesen einer Textdatei mit Zahlen



  • Hallo,

    er schießt mir eine Fehlermeldung aus (Windows): lesen.exe funktioniert nicht mehr...

    etwas ist im Code falsch...

    Gruß



  • 1. Was du da machst, weiß ich nicht.

    2. Willst du Dinge einlesen, solltest du immer den operator>> nehmen.

    3. Wenn deine Datei nur Zahlen hat, die durch ein Leerzeichen getrennt sind, kommt dir das zu gute. Der operator>> ignoriert die Leerzeichen automatisch.

    4. Ich weiß nicht was FILE und fpopen und Co sind, willst du jedoch richtiges C++ machen, nimmst du ifstream . Du brauchst dabei weder ein open noch ein close , da die Datei automatisch geöffnet wird, wenn du den Dateinamen dem Konstruktor übergibst, und sie wird automatisch wieder geschlossen, wenn das ifstream-Objekt den Gültigkeitsbereich verlässt (RAII).

    5. Willst du mit operator>> ein int , dann tut ER das für dich. Du musst dich dabei nicht um irngedwelche Konvertierungen kümmern.

    6. Ich gehe stark davon aus, dass du nicht weißt, wie viele Zahlen in der Datei letztendlich vorhanden sind. Sprich die Größe deines Arrays sollte dynamisch sein. Ein dynamisches Array ist in C++ std::vector . Ein Element fügst du mit push_back ein. Mit [] kannst du, wie bei einem normalen Array, auf die einzelnen Elemente zugreifen.

    1. <conio.h>, <windows.h>, <stdio.h> brauchst du doch gar nicht.

    8. Wieso getch() ? Mach ein Breakpoint in die letzte Zeile. Falls du keinen Debugger nutzt, dann fang noch heute damit an. Und verwende eine geeignete IDE. Die meisten nehmen untern Windows Visual Studio, und unter Linux Code::Blocks.

    9. Für Zeichenketten verwendet man in C++ nicht char[], sondern std::string .

    10. Nimm Postfix-Inkrement, wenn du einen guten Grund dafür hast, ansonsten nimm Prefix-Inkrement. In deinem Beispiel gibts keinen Grund num++ zu schreiben, also nimm ++num . (Bei int mag das keine Rolle spielen, bei anderen Dingen wie z.B. Iteratoren sehr wohl.)

    11. Wenn du eine neue Zeile willst, dann nimm '\n' und nicht endl .



  • renske96 schrieb:

    Hallo,

    er schießt mir eine Fehlermeldung aus (Windows): lesen.exe funktioniert nicht mehr...

    etwas ist im Code falsch...

    Gruß

    Geht so. Die Datei test.txt liegt dann nicht im selben Verzeichnis wie dein Programm. Die Datei konnte also nicht geöffnet werden, der Stream wird aber trotzdem benutzt, daher der Absturz. Der Code ist nur insofern falsch, dass er das nicht berücksichtigt. "Richtig" wäre also

    #include <fstream>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        vector<int> zahlen;
        ifstream file("test.txt");
        if(!file.is_open())
        {
             std::cout << "Fehler beim Oeffnen der Datei!\n";
             return 0;
        }
        for(int i; file>>i; zahlen.push_back(i));
        cout << "Zahl 1:" << zahlen[0];
    }
    


  • renske96 schrieb:

    er schießt mir eine Fehlermeldung aus (Windows): lesen.exe funktioniert nicht mehr...

    etwas ist im Code falsch...

    Wo, wie, was 😕


  • Mod

    out schrieb:

    renske96 schrieb:

    er schießt mir eine Fehlermeldung aus (Windows): lesen.exe funktioniert nicht mehr...

    etwas ist im Code falsch...

    Wo, wie, was 😕

    Das wird wohl an der Ausgabe von zahlen[0] liegen, obwohl dieses nicht existieren könnte. Wahrscheinlich wird die Datei gar nicht geöffnet.



  • Incocnito schrieb:

    Die Datei test.txt liegt dann nicht im selben Verzeichnis wie dein Programm. Die Datei konnte also nicht geöffnet werden, der Stream wird aber trotzdem benutzt, daher der Absturz.

    Mit Sicherheit liegt das nicht am Stream-Objekt. Dieses geht dann in einen Fehlerzustand über, falls die Datei nicht vorhanden ist, und die Leseoperationen werden einfach nicht ausgeführt. Wenn das Programm abkackt, dann liegt das an der Ausgabe zahlen[0] , weil im vector dann keine Elemente drin sind.



  • out schrieb:

    Mit Sicherheit liegt das nicht am Stream-Objekt. Dieses geht dann in einen Fehlerzustand über, falls die Datei nicht vorhanden ist, und die Leseoperationen werden einfach nicht ausgeführt.

    Achja, stimmt.
    Irgendwie ein Designfehler, finde ich.
    Ist ja quasi die "Kopf-in-den-Sand-steck" Methode.

    Edit: Ne, wenn man genauer drüber nachdenkt eher nicht. Der Wert einer Variable wird dabei ja nicht verändert und der Fehlerstatus wird gesetzt. Trotzdem, alles von Hand nachzuchecken nervt schon ein bisschen..



  • Also ich habe das Programm von Incocnito genommen und des cmd fenster "blitzt" auf und verschwindet, trotz getch(), system("PAUSE") oder ähnliches.



  • renske96 schrieb:

    Also ich habe das Programm von Incocnito genommen und des cmd fenster "blitzt" auf und verschwindet, trotz getch(), system("PAUSE") oder ähnliches.

    Klar, da ich bei der If-Abfrage direkt ein "return 0" eingebaut hab, was das Programm beendet, damit nicht mit der falschen Annahme weitergearbeitet werden kann, die Datei sei geöffnet. Da muss ja logischerweise auch was hin:

    #include <fstream>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        vector<int> zahlen;
        ifstream file("test.txt");
        if(!file.is_open())
        {
             std::cout << "Fehler beim Oeffnen der Datei!\n";
             std::cin.get();
             return 0;
        }
        for(int i; file>>i; zahlen.push_back(i));
        cout << "Zahl 1:" << zahlen[0];
        std::cin.get();
    }
    


  • Incocnito schrieb:

    Achja, stimmt.
    Irgendwie ein Designfehler, finde ich.
    Ist ja quasi die "Kopf-in-den-Sand-steck" Methode.

    Wieso Designfehler? Verstehe ich nicht. Du willst eine Datei öffnen, und das hat nicht funktioniert. Schlimm wäre es, wenn dich das Stream-Objekt nicht darauf aufmerksam machte und nicht in einen Fehlerzustand überginge...



  • out schrieb:

    Incocnito schrieb:

    Achja, stimmt.
    Irgendwie ein Designfehler, finde ich.
    Ist ja quasi die "Kopf-in-den-Sand-steck" Methode.

    Wieso Designfehler? Verstehe ich nicht. Du willst eine Datei öffnen, und das hat nicht funktioniert. Schlimm wäre es, wenn dich das Stream-Objekt nicht darauf aufmerksam machte und nicht in einen Fehlerzustand überginge...

    Ja, hast recht. Ich finds nur nervig, so oft nachgucken zu müssen, ob der Fehlerstatus gesetzt ist. Bei boost::filesystem zb. wird direkt eine Exception geworfen, wenn ein Ordner nicht geöffnet werden konnte. Find ich persönlich ein bisschen einfacher, dann kann einem sowas wie hier gar nicht erst passieren.



  • exceptions()

    ~Edit: Geht halt nur nach Konstruktion.~



  • der sagt, dass der die datei nicht findet, obwohl sie im gleichen ordner ist. was mache ich falsch?

    EDIT: Keine Idee mehr?



  • renske96 schrieb:

    der sagt, dass der die datei nicht findet, obwohl sie im gleichen ordner ist. was mache ich falsch?

    Im gleichen Ordener wie was? Sie muss im gleichen Ordner wie das .exe liegen. Oder gebe den absoluten Pfad der Datei an.

    Gruß
    Werner


Anmelden zum Antworten