File-Pointer an Anfang der Datei zurück setzen



  • ich habe eine methode geschrieben, mit der ich die anzahl der zeilen in einer datei durchzählen möchte. anschließend möchte ich die datei bearbeiten. dazu möchte ich den datei pointer wieder an den anfang zurück setzen. doch leider funktioniert das nicht.

    #include <string>
    #include <iostream>
    #include <fstream>
    
    int main( int argc, char *argv[] ) {
    
    	std::ifstream ifile;
    	std::string data_Path = "test.txt";
    
    	ifile.open( data_Path.c_str(), std::ios_base::in );
    	if( !ifile ) {
    		std::cerr << "File "<< data_Path << " could not be opened!" << std::endl;
    		return EXIT_FAILURE;
    	}
    
    	std::string buffer;
    	int counter = 0;
    	while( std::getline( ifile, buffer, '\n' ) ) {
    		if( !buffer.empty() )
    			counter++;
    	}
    	std::cout << counter << std::endl;
    
    	counter = 0;
    	ifile.seekg( 0, std::ios_base::beg );
    	while( std::getline( ifile, buffer, '\n' ) ) {
    		if( !buffer.empty() ) 
    			counter++;
    	}
    	std::cout << counter << std::endl;
    
    	ifile.close();
    }
    


  • #include <string>
    #include <iostream>
    #include <fstream>
    
    int main() 
    {
        std::ifstream ifile("test.txt", std::ios::in);
        if (!ifile)
        {
            std::cerr << "File "<< data_Path << " could not be opened!" << std::endl;
            return EXIT_FAILURE;
        }     
    
        std::string buffer;
        std::size_t i = 0;
        for (; std::getline(ifile, buffer); ++i);
    
        std::cout << i << std::endl;
    
        ifile.seekg(0, std::ios::beg);
    }
    

    was geht daran nicht?



  • int main( int argc, char *argv[] ) {
    
    	std::ifstream ifile;
    	std::string data_Path = "test.txt";
    
    	ifile.open( data_Path.c_str(), std::ios_base::in );
    	if( !ifile ) {
    		std::cerr << "File "<< data_Path << " could not be opened!" << std::endl;
    		return EXIT_FAILURE;
    	}
    
    	std::string buffer;	
    	std::size_t i = 0;
        for (; std::getline(ifile, buffer); ++i);
        std::cout << i << std::endl;
        ifile.seekg(0, std::ios::beg);
    
    	i = 0;
        for (; std::getline(ifile, buffer); ++i);
        std::cout << i << std::endl;
    
        ifile.close();
    }
    

    dann erzeug doch mal eine test.txt mit z.B. 5 zeilen. dann wirst du sehen, dass leider nicht i beim zweiten durchlauf 0 ist. daraus schließe ich, dass es nicht ein zweites mal durch die schleife läuft.



  • Am Ende der ersten Schleife ist das eofbit und failbit des Streams gesetzt - und in dem Zustand verweigert der Stream die Zusammenarbeit. Das heißt, bevor du weiterarbeiten kannst, mußt du ihn erst einmal in OK-Status zurücksetzen: ifile.clear(); .



  • @CStoll
    Danke!


Anmelden zum Antworten