Anfängerfrage: ifstream eine C-Funktion??



  • Hi,
    ich hab mir vor kurzem ein Buch gekauft um mir C++ einzuverleiben.
    Das Buch heist: "Der C++ Programmierer" (4. Auflage von 2015 - berücksichtigt bereits C++14).

    Ich bin momentan beim Kapitel mit Datei I/O.
    Dort wird das einlesen einer Datei so vorgenommen (Copy & Paste):

    #include<string>
    #include<fstream>
    #include<iostream>
    
    using namespace std;
    
    int main( ) {
        string quelldateiname;
        cout << "Quelldatei? ";
        cin >> quelldateiname; // darf wegen cin keine Leerzeichen enthalten!
        ifstream quelle( quelldateiname); // Objekt für Eingabestrom
        if (!quelle) { // Fehlerabfrage
            cerr << quelldateiname << " kann nicht geöffnet werden!\n";
        }
        else {
            while (quelle) { // Abbruch bei Fehler oder Ende der Datei
                string zeile;
                getline(quelle, zeile); // Lesen einer Zeile
                cout << zeile << ’\n’; // Anzeige
            }
        }
    } // Datei wird am Programmende automatisch geschlossen.
    

    Wenn ich das so abtippe, bringt mir der Compiler einen Fehler:

    main.cpp|11|error: no matching function for call to 'std::basic_ifstream<char>::basic_ifstream(std::string&)'|

    Ich hab nun herausgefunden dass ich mit der Methode c_str() arbeiten muss:

    ifstream quelle(quelldateiname.c_str()); // Objekt für Eingabestrom
    

    Auf http://www.highscore.de/cpp/aufbau/cppstandard.html#cppstandard_string hab ich dazu gelesen:

    Die Methode c_str() gibt einen Zeiger auf einen Puffer zurück, in dem der String mit einem Nullzeichen abgeschlossen ist. Da Strings in C üblicherweise mit einem Nullzeichen abgeschlossen werden, wird diese Methode immer dann verwendet, wenn ein String an eine C-Funktion übergeben werden muss.

    Ich arbeite auf Windows mit Code::Blocks 13.12. Die Installation fand aber bereits lange vor C++14 statt. Hab ich jetzt einen veralteten Compiler bzw alte Libraries oder ist das ein Fehler im Buch? (In dem Fall würde ich mir das dann gerne markieren, damit ichs beim nächsten durchlesen gleich richtig verstehe^^)

    danke schon mal f. die Antworten 😃



  • Hi, du musst die C++11 Features erst aktivieren mit Flags. Musst mal bei den Compiler Optionen schauen. Ich weiß sie nicht auswendig, aber versuch mal -std=c++11.



  • Inzwischen geht auch ein std::string mit neuem Compiler.
    Aber daß man immer wieder mal "C-Funktionen" benutzen muss, ist voll ok. Das heißt nur, daß die Funktion in C UND C++ existiert und nicht bloß in C++.



  • Alte Library oder C++11 Features nicht aktiviert. Den ifstream Konstruktor mit std::string als Parameter gibts erst seit dann (http://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream).



  • Ah, vielen Danke, das hat geholfen 😃

    Für Leute mit ähnlichen Problem:
    in Code::Blocks oben auf :
    Settings > Compiler...
    dort dann das Häckchen setzen:
    http://www.fotos-hochladen.net/view/unbenanntdkao90wyxm.png



  • Da sind noch mehr interessante Checkboxes, z.B. -O2 oder -O3, AVX, -fomit-frame-pointer. Besser ist MS VS 2015 Community. Da geht viel mehr und richtiges x64.



  • Erhard Henkes schrieb:

    richtiges x86.

    Und was soll das sein?



  • sorry, x64 natürlich. 😃



  • Gibt es etwa auch falsches x64?



  • Erhard Henkes schrieb:

    Da sind noch mehr interessante Checkboxes, ... AVX, ...

    Immer vorsichtig sein, was man Frischlingen für Ideen gibt. Wenn man Pech hat gibt es dann als nächstes "Mein Programm 'funktioniert nicht mehr'", was sich dann nach endloser Diskussion und Hilfe beim debuggen als sowas wie "Illegal Instruction" herusstellt.
    Und ja, Prozessoren die sowas nicht können sind heute durchaus noch nicht selten (alles vor 2011, z.B. Core i7-880, etc.).

    Finnegan



  • Erhard Henkes schrieb:

    Da sind noch mehr interessante Checkboxes, z.B. -O2 oder -O3, AVX, -fomit-frame-pointer. Besser ist MS VS 2015 Community. Da geht viel mehr und richtiges x64.

    Das macht mich jetzt aber traurig.

    Nicht das Code::Blocks-Bundle mit Compiler nehmen, sondern einen Nighty von CB und MSYS2 als Compiler. Wäre mir neu, daß der kein richtiges x64 macht. Meinste damit, daß er asm-Sachen ablehnt? Kann ich auf Arbeit mal testen.

    Naja, -O3 -march=native -DNDEBUG -std=c++1y und ich möchte sehen, ob MS da rankömmt.



  • salusina schrieb:

    while (quelle) { // Abbruch bei Fehler oder Ende der Datei
                string zeile;
                getline(quelle, zeile); // Lesen einer Zeile
                cout << zeile << ’\n’; // Anzeige
            }
    

    Ich hoffe, dass "Uli" zu diesem Beispiel anmerkt, dass es nicht ganz korrekt ist.

    Das Mantra lautet: lesen, überprüfen, verarbeiten.
    Der Code macht aber: überprüfen, lesen, verarbeiten.
    Evtl. hast Du Dich ja auch schon gewundert, warum da immer eine Zeile mehr ausgegeben wird als in der Quelldatei stehen.


Anmelden zum Antworten