terminate called after throwing an instance of



  • terminate called after throwing an instance of 'std::ios_base::failure'
    what(): basic_ios::clear
    Abgebrochen

    schafft es jemand mir diese Fehlermeldung zu erklären ohne den Code zu kennen?
    ich möchte es gerne verstehen.
    die Fehlermeldung kommt zur Laufzeit wodurch wird sie ausgelöst bzw. durch welchen Umstand kommt sie zustande?

    thx miko





  • hier mal was ich zum testen geschrieben habe
    lasst es ruhig Kritik hageln. aber bitte erklärt mir warum ich hier eine eof exception bekomme. thx

    #include <iostream>
    #include <cstdlib>
    #include <fstream>
    #include <exception>
    
    class file : public std::fstream
    {
    	public:
    	std::string filename;
    	file ( const char * filename, std::ios_base::openmode mode )
    	: filename (std::string(filename))
    	{
    		std::cout << "open file " << filename << '\n';
    		/* kein oefbit */
    		this->exceptions ( std::ios_base::failbit | std::ios_base::badbit );
    		try {
    			this->open ( filename, mode );
    		} catch ( std::ios_base::failure e ) {
    			std::cerr << filename << ": " << e.what () << '\n';
    		}
    	}
    	~file ( void )
    	{
    		if ( this->is_open () )
    			this->close ();
    	}
    };
    
    int
    process(std::ifstream& in, std::ofstream& out)
    {
    	char ch;
    	try {
    		while ( in.eof () == false ) {
    			in.get(ch);
    			out.put(ch);
    		}
    
    		return (EXIT_SUCCESS);
    	} catch (ios_base::failure e) {
    		std::cerr << "process: " << e.what () << '\n';
    
    		if (in.good () )
    			std::cout << "good\n";
    		/*else*/ if ( in.eof () )
    			std::cout << "eof\n"; /* eof wird dennoch geworfen !? */
    		/*else*/ if (in.fail () )
    			std::cout << "fail\n";
    		/*else*/ if (in.bad () )
    			std::cout << "bad\n";
    
    		return (EXIT_FAILURE);
    	}
    }
    
    int
    main(int argc, char** argv)
    {
    
    	if (argc != 3) {
    		std::cerr << "Usage: " << argv[0] << " <InputFile> <OutputFile>\n";
    		exit (EXIT_FAILURE);
    	}
    
    	file fin  (argv[1], std::ios_base::binary|std::ios_base::in);
    	file fout (argv[2], std::ios_base::binary|std::ios_base::out);
    
    	if ( fin.is_open () == false || fout.is_open () == false )
    		exit (EXIT_FAILURE);
    
    	return (process(reinterpret_cast<ifstream&>(fin),reinterpret_cast<ofstream&>(fout)));
    }
    

    Edit: Kritik ...



  • Kritik



  • lol.
    solange der reinterpret_cast da ist, schau ichs nicht weiter an.



  • Mal abgesehen, dass dein Konzept und Code grausam ist ...

    badbit: Error due to the failure of an input/output operation on the stream buffer.

    while ( in.eof () == false )
    

    Ich glaube, es kann erst festgestellt werden, ob man am Ende einer Datei ist, nachdem man versucht hat, vom Stream zu lesen. D.h.

    in.get(ch);
    

    wirft eine Exception, da du sie vorher angeschaltet hast.

    catch (ios_base::failure e) {
      std::cerr << "process: " << e.what () << '\n';
    
      if (in.good () )
        std::cout << "good\n";
    

    Kann das ueberhaupt jemals eintreten?



  • nein das good kann, da eine execption eingetreten ist, logisch nicht wahr sein.
    auch die else if müssen nach if geändert werden, da ja theoretisch alles wahr sein könnten und dann auch angezeigt werden sollte.
    klar - beim 2mal seh ich es nun auch^^

    @ volkard :1. wollte ich mal sehen ob es auch wirklich geht^^ und der Funktions "aufruf" spricht die parameter liste war mir so vorgegeben 😃 da hab ich die Parameter so gelassen.

    C/C++ Code:
    while ( in.eof () == false )
    Ich glaube, es kann erst festgestellt werden, ob man am Ende einer Datei ist, nachdem man versucht hat, vom Stream zu lesen. D.h.
    C/C++ Code:
    in.get(ch);
    wirft eine Exception, da du sie vorher angeschaltet hast.

    hm ich teste doch auf -> EOF erreicht -> nein -> lese -> EOF erreicht -> nein -> lese ... geht das so nicht? Steht eof nicht am Beginn auf false?

    Mal abgesehen, dass dein Konzept und Code grausam ist ...

    ist das mit der klasse file zu grausam um darüber zu sprechen?
    ich wollte so zentral das öffnen von Dateien verwalten fehler anzeigen und vllt später auch das diese klasse einen dialog anzeigt der ein datei-auswahl enthält. dazu sollte dann ein zweiter konstrukter her.


Anmelden zum Antworten