Datei binär lesen/schreiben



  • theoretisch klingt das logisch^^ jo das müsste hinhauen



  • du benutzt auch diesen Operator : "~"?



  • nur wie ^^

    CFile file;
    	if (file.Open("test.txt",CFile::modeReadWrite) ==0)
    	{
    		if (file.Open("test.dat",CFile::modeCreate) == 0)
    		{
    			AfxMessageBox("Tja, war wohl nix");
    		}
    	}
    	file.SeekToBegin();
    	bool value;
    	file.Read(&value,1);
    	if (value = true)
    	{
    		value = false;
    		file.Write(&value,1);
    	}
    	else
    	{
    		value = true;
    		file.Write(&value,1);
    	}
    

    so jedenfalls nicht 😕



  • Pellaeon schrieb:

    du benutzt auch diesen Operator : "~"?

    Nein aber jetzt da du es erwähnst ... ich hab doch mal irgendwo was von operatoren zur manipulation von bits gelesen 🙄



  • CFile benötigt 2 Open-Flags, ansonsten wirst du da Probleme bekommen

    Und nun zu deinem rumrechnen: du liest mit Read ein BYTE aus, NICHT ein BIT.
    Du kannst mit ~ aber das Einerkomplement machen, da wird von jedem Bit das Gegenteil genommen, also das was du willst



  • versteh ich nicht 😃

    1. Das mit den 2 Openflags hab ich jetzt auch in der MSDN gesehen aber warum ist mri noch schleierhaft
    2. Wär das alles ganz einfach wenn ich file = ~file machen könnte, geht aber leider nicht
    3. weiss ich spontan auch nicht wie ich das = umgehen sollte

    Ich frag zwar ungern aber wenn der code nicht umfangreich ist könntest du den posten?
    Ich kann mir da sonst wenig vorstellen



  • mhmh ich habs jetzt hinbekommen allerdings nicht mit variabler größe

    CFile file;
    	if (file.Open("test.txt",CFile::modeReadWrite | CFile::typeBinary) ==0)
    	{
    		if (file.Open("test.txt",CFile::modeCreate | CFile::typeBinary) == 0)
    		{
    			AfxMessageBox("Fehlschlag");
    		}
    	}
    	char pBuf[100]; //hier wäre ne variable größe praktisch
    	UINT nBytesRead = file.Read(pBuf,100);
    	for (UINT i = 0; i<nbytesRead;i++)
    	{
    		pBuf[i] = ~pBuf[i];
    	}
    	file.SeekToBegin();
    	file.Write(pbuf,nBytesRead);
    	file.Flush();
    	file.Close();
    


  • zu den Open-Flags: die Klasse möchte halt einen Flag, wie die Datei zu öffnen ist: also lesen u/o. schreiben usw. und als zweites einen Zugrifssmodus, also ob und wie andere Prozesse auf die Datei zugreifen dürfen, deswegen 2.

    ~file geht natürlich nicht^^ Das ist ein Objekt, und ich bezweifel das für CFile der ~ Operator geschrieben wurde, macht ja auch keinen Sinn^^

    Zum Read einen Hinweis: wenn du liest, steht der Dateizeiger nach dem Lesen automatisch so viel Bytes weiter, wie du gelesen hast. Das bedeutet, wenn du jetzt ein write machst, überschreibst du nicht das gelesene, sondern das, was dahinter steht.

    Wenn die Textdatei nicht riesig ist, dann lies doch alles auf einmal ein, veränder die Daten und schreib die Datei neu. (beachte dazu Read und ReadHuge, siehe MSDN 🙂 ).

    int length = file.GetLength();
    char* pText = new char[lenght];
    
    file.ReadHuge(pText,length);
    file.Close();
    
    for(int i = 0; i < length;++i)
    {
       pText[i] = ~(pText[i]);
    }
    
    file.Open(path,CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive);
    file.WriteHuge(pText,length);
    
    delete []pText;
    

    So ich hoffe das stimmt. Hab das nicht getestet, aber das wäre was mir dazu einfällt.Wenn du nicht den Extra-Puffer willst, dann lies ein Byte ein, ändere es mit ~, setze den Dateizeiger ein Byte zurück und schreibe das veränderte Byte.



  • danke ^^
    jetzt wo ichs seh ist es logisch
    blöder Vollmond, raubt mir den schlaf und lässt mich blöde fragen stellen 😞



  • ich sehe mein Post ist zu spät. Kannst aber schauen wie das mit der variablen Länge geht, also doch nicht ganz umsonst 😉

    ach ja lass das type_binary weg, weil erstens

    MSDN schrieb:

    CFile::typeBinary Sets binary mode (used in derived classes only).

    Zweitens die Daten werden eh binär gelesen bei CFile. Text wird es nur dadurch, das wir die Bytes als char interpretieren, die da drinnen stehen.


Anmelden zum Antworten