.txt Dateien



  • In meinem Buch (Einstieg in C++ von Galileo Computing von 2009) ist leider nicht darin zu finden. Es ist ja nicht so, dass ich nicht gesucht hätte.



  • Komisch

    Ihre Suche nach 'ifstream' ergab folgendes Ergebnis:

    > 4 Treffer auf 509 durchsuchten Buchseiten in 0,111 Sek.

    Einstieg in C++
    Ergebnisse aus dem Buch:
    Einstieg in C++

    4 Treffer (von 4 Treffern im Buch)
    Seite 365:
    Relevanz: 100% ... *Es gibt zwei spezielle Stream-Klassen. Die Klasse ifstream impliziert als ofstream und* ifstream ... [Seite anzeigen]
    Seite 367:
    Relevanz: 94% ... Daneben gibt es noch eine globale Funktion namens getline(), die ein*Objekt vom Typ ifstream als ersten Parameter hat. Diese globale Funktion*arbeitet auch mit der Standardklasse string und akzeptiert ein Objekt ... {* ifstream f; // Datei-Handle* string s; ... [Seite anzeigen]
    Seite 504:
    Relevanz: 82% ... open() 364 if 72, 434* read() 368 ifstream 363, 365* write() 368 include 66 ... [Seite anzeigen]
    Seite 370:
    Relevanz: 79% ... und bewegt sich durch Lesen oder Schreiben immer weiter in Richtung* Dateiende. Um die Position zu ermitteln, bietet die Klasse ifstream die* Funktion seekg() an. Die Klasse fstream verwendet zur Änderung der ...


  • Mod

    Has das Buch denn keinen Index?


  • Mod

    Galileo-Computing ist hier im Forum übrigens berüchtigt für schlecht lektorierte Bücher. Häufig auch noch von Hack-Autoren, die jedes Jahr drei Bücher zu vier verschiedenen Sprachen rausbringen, die dann entsprechend eher durch Stil als durch Fachwissen glänzen. Wenn man nach diesen lernt, kann man sich in der krititschen frühen Lernphase schlechte Angewohnheiten zulegen, die man später schwer wieder los wird.



  • Ich bin auch nicht wirklich begeistert von dem Buch. Ist aber das Einzige was ich habe. Habe gedacht, es gäbe im Netz ne gute SEite wo dies beschrieben ist.


  • Mod

    evo-style schrieb:

    Ich bin auch nicht wirklich begeistert von dem Buch. Ist aber das Einzige was ich habe. Habe gedacht, es gäbe im Netz ne gute SEite wo dies beschrieben ist.

    Im Netzt findest du eigentlich nur Referenzen (die voraussetzen, dass du genug Grundlagen kannst, um sie zu verstehen) und Artikel zu fortgeschrittenen Themen (die setzen die Grundlagen erst recht voraus). Die C++-Grundlagen sind dermaßen umfangreich, wer dazu versucht eine kurze Einführung zu schreiben
    1. muss richtig Ahnung haben.
    2. hat am Ende ein dickes Buch, wenn er wirklich alles erklärt.



  • evo-style schrieb:

    Ich habe eine Datei, welche in etwas so aufegabut ist:

    Liste 1
    -------

    ------------Stand.-Rohwert:----Normgrösse:
    Pos.1-------------0----------------0
    Pos.2-------------5----------------12
    Pos.2-------------16---------------36

    Hallo evo-style,

    sind die "-----" tatsächlich Minus-Zeichen, oder hast Du sie stellvertretend für Leerzeichen eingezogen?
    Im zweiten Fall wird das Einlesen einfach.
    Ansonsten verwende bitte die Code-Tags [ code ][ /code ], um den Inhalt der Datei genau darzustellen.

    Gruß
    Werner



  • @ Werner Salomon: Die Minus Zeichen stehen stellvertretend für ein Leerzeichen.



  • evo-style schrieb:

    @ Werner Salomon: Die Minus Zeichen stehen stellvertretend für ein Leerzeichen.

    Dann geht's nach Schema F:
    - struct/class bauen in die ein Datensatz passt
    - Streaming-Operator für die struct/class erstellen
    - for-Schleife zum Einlesen
    - Am Ende auf EOF prüfen, ob bis ans Ende gelesen wurde.

    Hier kommt noch hinzu, dass anscheinend in der ersten Zeile eine Überschrift steht und am Anfang jeder Zeile ein "Pos.#", was man aber beides mit ignore überlesen kann.
    Ich unterstelle, Deine Datei sieht etwa so aus:

    Stand. Rohwert:    Normgrösse:
    Pos.1             0                0
    Pos.2             5                12
    Pos.2             16               36
    

    dann funktioniert folgendes:

    #include <iostream>
    #include <fstream>
    #include <limits>
    
    struct Record
    {
        int srw_; // Stand.-Rohwert
        int normgr_; // Normgrösse
    };
    // --   Lese einen Datensatz bestehend aus Stand.-Rohwert & Normgrösse ein
    std::istream& operator>>( std::istream& in, Record& rec )
    {
        return in >> rec.srw_ >> rec.normgr_;
    }
    
    int main()
    {
        using namespace std;
        const streamsize ALL = std::numeric_limits< streamsize >::max();
        ifstream datei("Liste1.txt");
        if( !datei.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return -2;
        }
        datei.ignore( ALL, '\n' ); // erste Zeile "Stand.-Rohwert: Normgrösse" überlesen
        for( Record rec; (datei >> ws).ignore( ALL, ' ' ) >> rec; ) // erstes Wort überlesen; dann 'Record' lesen
        {
            // ... mache irgendwas mit 'rec'
            cout << "Normgroesse: " << rec.normgr_ << endl;
        }
        if( !datei.eof() )
            cerr << "Lesefehler" << endl;
    
        return 0;
    }
    

    Gruß
    Werner



  • Vielen Dank im Voraus. Werde es gleich probieren! Ist echt super nett!



  • Kann es leider nicht übersetzen in Zeile 31 sei ein Fehler "::". Das ist folgende Zeile:

    const streamsize ALL = std::numeric_limits< streamsize >::max();

    Konntest du das Übersetzen Werner Salomon?


  • Mod

    edit: Hier stand Mist.

    P.S.: Gib mal bitte die genau Fehlermeldung an.



  • evo-style schrieb:

    Kann es leider nicht übersetzen in Zeile 31 sei ein Fehler "::". Das ist folgende Zeile:

    const streamsize ALL = std::numeric_limits< streamsize >::max();

    Falls Du unter Windows arbeitest und ein #include "stdafx.h" oder ein #include "windows.h" oder etwas äquivalentes oberhalb dieser Zeile stehen hast, musst Du vor dem ersten #include-Statement ein #define NOMINMAX setzen.

    In z.B. "Windows.h" ist max als Makro definiert.

    Gruß
    Werner



  • Der genau Fehler lautet:

    error C2059:Syntaxfehler:'::'
    error C2589: 'ungültiges Token auf der rechten Seite von '::'

    Ich arbeite mit VisualStudio 2010 Express.

    #include "stdafx.h" wie auch #include "Windows.h" ist drin.
    include Statement ist auch eingefügt, läauft aber immer noch nicht 🙄


  • Mod

    evo-style schrieb:

    #include "stdafx.h" wie auch #include "Windows.h" ist drin.
    include Statement ist auch eingefügt, läauft aber immer noch nicht 🙄

    Lies Werners Antwort noch einmal genau!



  • evo-style schrieb:

    include Statement ist auch eingefügt, läauft aber immer noch nicht 🙄

    Hallo evo-style,

    Wenn das obige nur ein Tippfehler in Deiner Antwort ist, und Du alles richtig gemacht hast, so kann es noch daran liegen, dass Du 'precompiled Header' verwendest. Wir verwenden sie gar nicht mehr, weil 'precompiled Header':
    - machen nur Ärger
    - Build dauert länger (JA länger - wir haben es gemessen!)
    - Müllt die Platte mit riesigen pch-Dateien voll
    - sind sinnlos, ich weiß nicht wozu die gut sind.

    Also, wenn Du 'precompiled Header' verwendest, dann setze das #define NOMINMAX in das stdafx.h in die erste Zeile vor allen #include-Statements und mache ein 'rebuild all'. Oder alternativ/besser 'precompiled header' in Projekt-Settings abschalten, und stdafx.cpp aus dem Projekt entfernen.

    Gruß
    Werner



  • War ein Tippfehler von mir Sorry! Was ist denn ein rebuild all oder ein precompiled header? Leider bin ich noch blutiger Anfänger und habe keine Ahnung was dass heissen soll. 😞



  • Schau mal hier, was ich gefunden habe. Got the hint?


Anmelden zum Antworten