fehler in std::fstream?!?



  • hallo erstmal...
    der titel verräts schon. ich hab da nen kleines fstream-problem
    also ich hatte mir das folgende kleine verschlüsselungsprogramm geschrieben:

    #include <fstream>
    #include <iostream>
    #include <string>
    
    int main()
    {
    	std::cout << "Enter input filename: ";
    	std::string input_filename;
    	std::getline(std::cin, input_filename);
    	std::ifstream input_file(input_filename.data(), std::ios::in | std::ios::binary);
    	if (!input_file.is_open())
    	{
    		std::cerr << "Error: Input file not found. Quit." << std::endl;
    		return 1;
    	}
    
    	std::cout << "Enter output filename: ";
    	std::string output_filename;
    	std::getline(std::cin, output_filename);
    	std::ofstream output_file(output_filename.data(), std::ios::out | std::ios::binary);
    	if (!output_file.is_open())
    	{
    		std::cerr << "Error: Unable to open output file. Quit." << std::endl;
    		return 2;
    	}
    
    	std::cout << "Enter passphrase: ";
    	std::string key;
    	std::getline(std::cin, key);
    	if (key.size() % 2 == 0)
    	{
    		key.erase(key.end() - 1);
    		std::clog << "Warning: Last character of key ignored." << std::endl;
    	}
    
    	while (!input_file.eof())
    	{
    		char c = input_file.get();
    		for (std::string::const_iterator i = key.begin(); i != key.end(); ++i)
    			c ^= *i;
    		output_file.put(~c);
    	}
    
    	std::cout << "Success" << std::endl;
    
    	return 0;
    }
    

    problem: wenn ich eine testdatei einmal ver- und dann wieder entschlüssele wurden 2 bytes ans ende angehängt, also zu viel geschrieben 😮
    ich find die stelle im code, wo das steht grade nich... wenn mir das eben einer erklären könnte 🙄
    ich bin mir auch ziemlich sicher, dass ich ein ähnliches problem schonmal hatte. weiss aber nicht mehr genau wobei...

    schonmal danke



  • Ich weiss jetzt nicht, ob das der Fehler ist. Könnte es sich dabei aber vielleicht schlicht und einfach um das Zeichen handeln, mit dem C++ das Ende eines Strings markiert?



  • Du liest EOF noch ein, und das ist ein Zeichen hinter dem Ende der Datei. Machs so:

    char c;
        while (!input_file.get(c))
        {
            for (std::string::const_iterator i = key.begin(); i != key.end(); ++i)
                c ^= *i;
            output_file.put(~c);
        }
    


  • 0xdeadbeef schrieb:

    Du liest EOF noch ein, und das ist ein Zeichen hinter dem Ende der Datei

    Oder in XXL:
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=eof#Answ


Anmelden zum Antworten