Fragen zum einlesen von Datein (ifstream)



  • Ich habe eine Frage zum Einlesen von Datein.

    In meinem ersten Buch wurde es mir so erklärt:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
    	ifstream dat_ein; //Stream deklarieren
    	string s; // String zum Einlesen deklarieren
    
    	dat_ein.open(("Beispiel.txt"), ios_base::in); // Stream öffnen, Dateinamenübergeben und Öffnungsmodus setzen.
    
    	while(!dat_ein.eof()) // Einlesen
    	{
    		getline(dat_ein, s);
    		cout << s << endl;
    	}
    
    	dat_ein.close(); 
    }
    

    Im Buch steht, dass .eof() einen Nullwert zurückliefert wenn das Dateiende erreicht ist, und die Schleife dann verlassen wird.

    Nun steht in einem anderen Buch folgendes:

    #include <iostream>
    #include <fstream>
    #include <fstream>
    using namespace std;
    
    int main()
    {
    	ifstream dat_ein; //Stream deklarieren
    	string s; // String zum Einlesen deklarieren
    
    	dat_ein.open("Beispiel.txt"); // Stream öffnen, Dateinamen übergeben und Öffnungsmodus setzen.
    
    	if(dat_ein.is_open()) // Einlesen
    	{
    		while(getline(dat_ein,s))
    		{
    			cout << s << endl;
    		}
    
    		dat_ein.close();
    	}
    	else cout << "Unable to Open file";
    
    }
    

    Hier habe ich nun die Funktion is.open(). Was genau bringt mir die?
    In meinem alten Buch stand, das der Stream (dat_ein) einen Nullwert zurück gibt, wenn das Öffnen der Datei fehlgeschlagen ist. Überprüft is.open() genau das hier?

    Desweiteren:

    Im neuen Buch steht, das getline() selbst den Wert 0 zurürck gibt, sobald das Dateiende erreicht ist. Warum sollte man dann eof() nutzen?

    Was ist der unterschied der beiden Methoden?

    Und muss ich den Öffnungsmodus ios_base::in angeben? Im zweiten Beispiel wurde er nicht verwendet. Fügt der Compiler das sonst automatisch ein wenn es fehlt?

    Wäre für eine Antwort dankbar. 🙂


  • Mod

    Namen des ersten Buches nennen (Jürgen Wolf?), dann dieses Buch wegwerfen.



  • zeroblack schrieb:

    Hier habe ich nun die Funktion is.open(). Was genau bringt mir die?

    Sie prüft nach, ob die Datei offen ist, bzw. geöffnet werden konnte.

    Desweiteren:

    Im neuen Buch steht, das getline() selbst den Wert 0 zurürck gibt, sobald das Dateiende erreicht ist. Warum sollte man dann eof() nutzen?

    In diesem Fall brauchst du eof() nicht.

    Was ist der unterschied der beiden Methoden?

    getline() gibt dir alles bis zum nächsten Zeilenumbruch zurück, das sollte klar sein. Als Rückgabewert wird der Stream selbst zurückgegeben, dieser hat nen operator bool implementiert, der das Gleiche tut, wie istream::is_open .

    Und muss ich den Öffnungsmodus ios_base::in angeben? Im zweiten Beispiel wurde er nicht verwendet. Fügt der Compiler das sonst automatisch ein wenn es fehlt?

    Nein. Der Konstruktor hat default-initialisierte Parameter. Siehe hier


  • Mod

    darkstream schrieb:

    Desweiteren:

    Im neuen Buch steht, das getline() selbst den Wert 0 zurürck gibt, sobald das Dateiende erreicht ist. Warum sollte man dann eof() nutzen?

    In diesem Fall brauchst du eof() nicht.

    Betonung: eof brauchst du so gut wie nie.

    Was ist der unterschied der beiden Methoden?

    getline() gibt dir alles bis zum nächsten Zeilenumbruch zurück, das sollte klar sein. Als Rückgabewert wird der Stream selbst zurückgegeben, dieser hat nen operator bool implementiert, der das Gleiche tut, wie istream::is_open .

    Nein, es macht viel mehr. Es ist das Äquivalent von !fail() .


Anmelden zum Antworten