Frage zu "Datei einlesen"



  • Hi Leute!

    Ich hab hier einen Code von der c++ referenz:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main ()
    {
    	char c, str[256];
    	ifstream file;
    
    	cout << "Enter the name of an existing text file: ";
    	cin.get (str,256);
    
    	file.open(str);        // open file
    
    	while (file.good())     // loop while extraction from file is possible
    	{
    		c = file.get();       // get character from file
    		if (file.good())
    		{
    			cout << c;
    		}
    	}
    
    	file.close();           // close file
    
    return 0;
    }
    

    Wenn ich nun die Datei "datei.txt", die im gleichen Ordner wie die main.cpp liegt, öffnen will, funktioniert das leider nicht. An was liegt das? Er springt mir vor der while-Schleife schon raus...



  • 1. Funktionirt nicht ist keine Problembeschreibung
    2. Die Datei wird im working directory geöffnet, die main.cpp interessiert nicht ( im Zweifelsfall ist sie gelöscht oder auf einem anderen Rechner)



  • Es ist erstaunlich wie beliebt die Referenz ist, denn der Code ist anders schlecht.

    1. Dateiname wird in char-Array gelesen
    2. Keine Spur von RAII
    3. Zweifacher Check auf good(), obwohl einer reichen würde und obwohl der Stream nach bool konvertierbar ist.
    4. (return 0 ist unnötig und using namespace std ist unschön)

    Und das in 11 Zeile Code 😮



  • Was heißt workin directory?

    Ich hab hier ein MS Visual studion 2010 Projekt offen und ich kann die datei da hinkopieren wo ich will, der öffnet mir die einfach nicht...

    Funktioniert nicht heißt er öffnet mir sie nicht. Ich hab eigentlich gedacht, dass ist an dieser Stelle klar.



  • Schreib einfach mal in ne Datei und schau wo sie gespeichert wird. 😉



  • Hab das mal teilweise umgesetzt was fairdiceroll schrieb:

    #include <iostream>
    #include <fstream>
    
    int main ()
    {
        char c;
        std::string str;
    
        std::cout << "Enter the name of an existing text file: ";
        std::cin >> str;
    
        std::ifstream file(str.c_str());        // open file - old style
        while (file.good())     // loop while extraction from file is possible
        {
            c = file.get();       // get character from file
            std::cout << c;
        }
    }
    

    Das:

    std::ifstream file(str.c_str());        // open file - old style
    

    sollten die aktuellen C++11 Compiler auch ohne:

    .c_str()
    

    können. Oder?



  • Etwas übersehen - es wird noch ein Zeichen geschrieben, wenn die Datei "bad". 😡

    Dann doch:

    while (file.good())     // loop while extraction from file is possible
        {
            c = file.get();       // get character from file
            if (file.good())	// => because the last char if file not good
                std::cout << c;
        }
    

    oder zeigt die bessere Lösung.



  • Wie ich mir das vorstelle:

    int main ()
    {
        std::cout << "Enter the name of an existing text file: ";
        std::string str;
        getline(std::cin, str);
    
        if (std::ifstream file{str}) // diese Zeile ist C++11
          for (char c=file.get(); file; c=file.get())
            std::cout << c;
    }
    


  • Weil es zu Lernzwecken ist, alternativ auch

    if (std::ifstream file{str})
      for (;;) {
        char c = file.get(); // extract char
        if (!file) // c may have the value of Traits::eof()
          break;   // then we have finished          
        std::cout << c;
      }
    

    Lustigerweise steht auf der C++ Referenz nichts von Traits::eof() . Das musste ich auf der wahren Referenz nachschauen.


Anmelden zum Antworten