wchar_t und fstream Problem.



  • Wenn ich mt den folgenden Zeilen in eine Datei schreibe:

    wchar_t fh[2];
    fh[0] = 'c';
    fh[1] = 'y';
    file.write((wchar_t*) &fh[0], sizeof(wchar_t));
    file.write((wchar_t*) &fh[1], sizeof(wchar_t));
    
    unsigned long size = 64;
    file.write((wchar_t*) &size, sizeof(long));
    

    und wieder auslesen will:

    wchar_t fh[2];
    file.read((wchar_t*) &fh[0], sizeof(wchar_t));
    file.read((wchar_t*) &fh[1], sizeof(wchar_t));
    
    if(file.eof())
       std::wcout << "EOF";
    // EOF tritt ein                                 //
    // ist hier die Datei zu Ende? Warum             //
    // Wenn ich char nehme, tritt das Prob nicht auf //
    
    unsigned long size;
    file.read((wchar_t*) &size, sizeof(long));
    

    Würde mich seht über eine schnelle Antwort freuen.



  • Tc++H schrieb:

    Wenn ich mt den folgenden Zeilen in eine Datei schreibe:

    [cpp]wchar_t fh[2];
    fh[0] = 'c';
    fh[1] = 'y';
    file.write((wchar_t*) &fh[0], sizeof(wchar_t));
    file.write((wchar_t*) &fh[1], sizeof(wchar_t));

    Welchen Char-Type verwendet file? Und mit welchen Flags öffnest du file?



  • schreiben:

    std::basic_fstream<wchar_t> file;
    file.open(filename.c_str(), std::ios_base::out | std::ios_base::binary);
    

    lesen:

    std::basic_fstream<wchar_t> file;
    file.open(filename.c_str(), std::ios_base::in | std::ios_base::binary);
    


  • Hat jemand schon eine Idee?



  • Tc++H schrieb:

    Hat jemand schon eine Idee?

    Wenn du einen wide-Stream verwendest, musst du die Anzahl der zu schreibenden Zeichen auch relativ zu sizeof(wchar_t) berechnen.
    So sollte es gehen:

    wchar_t fh[2];
    fh[0] = 'c';
    fh[1] = 'y';
    file.write(&fh[0], 1);
    file.write(&fh[1], 1);
    
    unsigned long size = 64;
    file.write((wchar_t*) &size, sizeof(long) / sizeof(wchar_t));
    

    Lesen:

    wchar_t fh[2];
    file.read(&fh[0], 1);
    file.read(&fh[1], 1);
    
    unsigned long size;
    file.read((wchar_t*) &size, sizeof(long) / sizeof(wchar_t));
    


  • Daran hatte ich auch schonmal gedacht.

    vielen Dank.



  • Klappt irgendwie immer noch nicht: hier ist mal der gesamt Code:

    bool encrypth(const std::basic_string<wchar_t>& str, const std::basic_string<wchar_t>& filename)
    {
    	std::basic_fstream<wchar_t> file;
    	file.open(filename.c_str(), std::ios_base::out | std::ios_base::binary);
    	if(!file)
    		return false;
    
    	wchar_t fh[2];
    	fh[0] = 'c';
    	fh[1] = 'y';
    	file.write((wchar_t*) &fh[0], 1);
    	file.write((wchar_t*) &fh[1], 1);
    
    	unsigned long size = static_cast<unsigned long>(str.length() * 4);
    	file.write((wchar_t*) &size, sizeof(unsigned long) / sizeof(wchar_t));
    
    	unsigned long y;
    	for(unsigned long i = 0; i < str.length(); i ++)
    	{
    		y = (str[i] + i) * (i + 10);
    		file.write((wchar_t*) &y, sizeof(unsigned long) / sizeof(wchar_t));
    	}
    
    	return true;
    }
    
    bool decrypth(std::basic_string<wchar_t>& str, const std::basic_string<wchar_t>& filename)
    {
    	std::basic_fstream<wchar_t> file;
    	file.open(filename.c_str(), std::ios_base::in | std::ios_base::binary);
    	if(!file)
    		return false;
    
    	wchar_t fh[2];
    	file.read((wchar_t*) &fh[0], 1);
    	file.read((wchar_t*) &fh[1], 1);
    
    	unsigned long size;
    	file.read((wchar_t*) &size, sizeof(unsigned long) / sizeof(wchar_t));
    
    	unsigned long y;
    	for(unsigned long i = 0; i < size / 4; i ++)
    	{
    		std::wcout << L"EOF"; // tritt ab hier immer wieder auf...
    		file.read((wchar_t*) &y, sizeof(unsigned long) / sizeof(wchar_t));
    		std::wcout << y << L" ";
    		str += static_cast<wchar_t>(y / (i + 10) - i);
    	}
    
    	return true;
    }
    


  • Warum so kompliziert?
    machs doch einfach so:

    fwstream Test(bla.bla , ios::in | ios::out)
    wchar_t wide;
    //so um ein wide character zu schreiben: 
    Test << wide;
    //so um einen zu lesen:
    Test >> wide;
    

    musst halt immer im auge behalten ob der Dateizeiger dort ist wo du ihn willst


Anmelden zum Antworten