ifstream und char*



  • Hallo, ich hab mal eine kurze Frage. Ich habe folgenden Code:

    #include <iostream>
    #include <fstream>
    #include <cstring>
    #include <cstdlib>
    
    int main()
    {
        char* filename;
        std::cout << "Enter the filename: ";
        std::cin >> filename;
    
        std::ifstream file(filename);
    
        if(!file)
        {
            std::cerr << "Cannot find file!";
            file.close();
            exit(EXIT_SUCCESS);
        }
    
        file.close();
        return 0;
    }
    

    Wenn ich das Programm ausführe und einen ungültigen Dateinamen eingebe, dann hängt sich das Programm auf, anstatt mit die Meldung "Cannot find file!" auszugeben. Ich hab herausgefunden, dass es mit der Klasse string funktioniert, aber warum nicht mit char* ?


  • Mod

    Dein char-Zeiger zeigt auf nix. Das wird sich bei jeder Eingabe aufhängen, nicht bloß bei unbekannten Dateinamen. die Frage ist: wieso willst du char-Arrays benutzen, wenn dies doch nur unnötig kompliziert ist (im Vergleich zu std::string) und du deren Grundlagen nicht kennst?



  • #include <iostream> 
    #include <fstream> 
    #include <cstring> //unnötig
    #include <cstdlib> 
    
    int main() 
    { 
        char* filename; // Schlimmstes: Das ist ein wilder Zeiger, mit der Extrahierung zwei Zeilen weiter unten schreibst du evt. in fremden Speicher
        std::cout << "Enter the filename: "; 
        std::cin >> filename; // So wirst du keine Dateinamen mit Leerzeichen einlesen können ;)
    
        std::ifstream file(filename); 
    
        if(!file) /// Lieber ::is_open() verwenden, ist aussagekräftiger mMn
        { 
            std::cerr << "Cannot find file!"; 
            file.close(); // Würdest du statt der gefährlichen exit()-Funktion ein return-Statement verwenden, wäre das auch überflüssig
            exit(EXIT_SUCCESS); // Wieso überhaupt? Wieso nicht einfach auslassen, zwei Zeilen weiter unten wird genau dasselbe gemacht!
        } 
    
        file.close(); // Unnötig, da dank RAII sowieso der Filestream geschlössen wird sobald das Scope-Ende erreicht wird (das ist hier eine Anweisung weiter hinten)
        return 0; /// Musst du nicht, macht schon der Compiler
    }
    

    Insgesamt wäre das also kürzer und besser:

    #include <iostream> 
    #include <fstream> 
    #include <string>
    
    int main() 
    { 
        std::string str;
        std::getline(std::cin, str);
    
        if(!std::ifstream(str.c_str()).is_open())
            std::cerr << "Cannot find file!"; 
    }
    


  • Was ist der Unterschied zwischen

    std::getline(std::cin, str);
    

    und

    std::cin >> str;
    

    ?


  • Mod



  • SeppJ schrieb:

    Dein char-Zeiger zeigt auf nix. Das wird sich bei jeder Eingabe aufhängen, nicht bloß bei unbekannten Dateinamen. die Frage ist: wieso willst du char-Arrays benutzen, wenn dies doch nur unnötig kompliziert ist (im Vergleich zu std::string) und du deren Grundlagen nicht kennst?

    Ich wollte mal ein Programm schreiben, ohne Hilfsklassen wie string. Einfach zum Üben und ums zu verstehen. Danke, du hast mir sehr geholfen 🙂


Anmelden zum Antworten