Funktionen funktionieren nur wenn ich sie einzeln aufrufe



  • Hallo,
    du löschst aber nach dem Lesen schon das eof-Bit, oder?



  • Hallo,
    danke ersteinmal.

    HumeSikkins schrieb:

    du löschst aber nach dem Lesen schon das eof-Bit, oder?

    Ich denke nicht, ich werde mal schauen wie das geht, mit dem eof bit bezeichnest du doch '\n' oder?
    Wäre nett wenn du dir mal meine methoden anschaust, ist allerdings recht schlecht gemacht dar ich dateien überschreibe weil ich mich mit vektoren nicht auskenne.
    Streaming.h:

    #ifndef STREAMING
    #define STREAMING
    
    #include <string>
    #include <fstream>
    using namespace std;
    
    class Streaming
    {
    private:
    	ifstream in;
    	ofstream out;
    	string content;
    public:
    	Streaming(const char *In,const char *Out);
    	~Streaming();
    
    	int m_seekEndOfInFile(void);
    	string m_readLine(int NumberOfLine);
    	bool m_writeLine(string Inhalt);
    
    };
    
    #endif //STREAMING
    

    Streaming.cpp:

    #include "Streaming.h"
    #include <fstream>
    #include <iostream>
    
    Streaming::Streaming(const char *In,const char *Out)   
    {  
        this->in.open(In,ios::out); //öffnen zum lesen mit Standardoptionen 
        this->out.open(Out,ios::out);  //öffnen zum schreiben mit Standardoptionen 
    }
    
    Streaming::~Streaming()
    {
    	in.close();
    	out.close();
    }
    
    //Sucht das ende der Textdatei (in Zeilen)
    int Streaming::m_seekEndOfInFile(void)
    {  
    	in.seekg(0,ios::beg);
    	int zaehler=0;
    	while(getline(in,content))
    	{
    		++zaehler;
    	}
    
    return zaehler;
    }
    
    //Lies eine Zeile aus einer Textdatei in einen String und gibt diese mit return zurück
    string Streaming::m_readLine(int NumberOfLine)
    {   
        in.seekg(0,ios::beg);
    	for(int i=0;i<NumberOfLine;i++)
    	{
    		getline(in,content);
    	}
    
    	return content;
    }
    
    //Schreibt eine Zeile den im string gespeicherten inhalt in eine Textdatei
    bool Streaming::m_writeLine(string Inhalt)
    {
    	if(!(out<<Inhalt))
    	{
    		return false;
    	}
    return true;
    }
    

    So wie es jetzt ist, wird der Inhalt der Textdatei zwar nicht gelöscht, aber auch nicht richtig ausgelesen.

    cu max



  • Hat das eigentlich einen bestimmten Grund, dass du alle Memberfunktionen mit einem m_ Präfix versiehst?



  • Ja, ich habe gelesen, das dass algemein üblich ist, ist es denn nicht so?

    cu max



  • @Bashar:
    Vielleicht damit man gleich erkennt, daß es Member sind... bei sowas wie object.doSomething(); kann man sich ja nie ganz sicher sein. 😃



  • Master_Max schrieb:

    Ja, ich habe gelesen, das dass algemein üblich ist

    Nein, das ist nicht üblich. Manche machen das für (private) Membervariablen.



  • mit dem eof bit bezeichnest du doch '\n' oder?

    Nein. Mit eof-bit bezeichne ich das eof-bit. '\n' ist ein Newline-Zeichen. eof steht für end-of-file. Das eof-bit eines Streamobjekts wird gesetzt, wenn man über das Ende einer Datei hinaus gelesen hat. Ist dieses bit einmal gesetzt liefert jeder weitere Lesevorgang solange eof (also keine weiteren Daten) bis das eof-bit wieder gelöscht wird.

    Abfragen kannst du das bit mit:

    if (in.eof())
    // eof-bit gesetzt
    else
    // eof-bit nicht gesetzt
    

    Wenn du gleich auch noch das bad- bzw. fail-bit abfragen willst:

    if (in.good())
    // ok. Stram ist zum Lesen bereit
    else
    // Aus Stream kann nicht gelesen werden
    

    Löschen tust du das eof-bit mit:

    in.clear(ios::eofbit)
    

    Oder du löschst alle Statusbits:

    in.clear();
    


  • Hi,
    danke.
    Achso ich dachte das Newline Zeichen wird auch ans ende eines Streams gesetzt.
    Gut ich werde mal schauen ob das hilft.

    [EDIT]Komisch das es in der Version davor noch ging, allerdings ohne eine .eof() abfrage oder ähnliches
    Eigentlich liest doch die while Schleife bis .eof und nicht weiter hinaus?
    [EDIT]

    vielen dank.

    cu max



  • Hi,
    danke an alle, es scheint zu gehen, hier nun die neuen methoden:

    /Sucht das ende der Textdatei (in Zeilen)
    int Streaming::m_seekEndOfInFile(void)
    {  
    	in.seekg(0,ios::beg);
    	int zaehler=0;
    	do{
            getline(in,content);
            ++zaehler;
    	}while(!in.eof());//Habe ich von Mis2com geklaut :rolling_eyes: 
    	in.sync();
    	in.clear();
    
    return zaehler;
    }
    
    //Lies eine Zeile aus einer Textdatei in einen String und gibt diese mit return zurück
    string Streaming::m_readLine(int NumberOfLine)
    {   
        in.seekg(0,ios::beg);
    	for(int i=0;i<NumberOfLine;i++)
    	{
    		getline(in,content);	
    	}
    
    	in.sync();
    	in.clear();
    
    	return content;
    }
    

    cu max



  • Master_Max schrieb:

    Hi,

    /Sucht das ende der Textdatei (in Zeilen)
    int Streaming::m_seekEndOfInFile(void)
    {  
    	in.seekg(0,ios::beg);
    	int zaehler=0;
    	do{
            getline(in,content);
            ++zaehler;
    	}while(!in.eof());//Habe ich von Mis2com geklaut :rolling_eyes: 
    	in.sync();
    	in.clear();
    
    return zaehler;
    }
    [...]
    

    Das hättest du besser nicht geklaut, da der Code nicht korrekt ist. Ersetz die falsche do-while-Schleife durch deine ursprüngliche und richtige while-Schleife und gut ist.


Anmelden zum Antworten