Zum Inhalt springen

Warum kann ich keine Dateien binär öffnen??


Net-srac

Empfohlene Beiträge

Ich will eine Datei binär öffnen, und dann anschliesend via Socket übertragen.

Ich hab die so hier geöffnet und will sie in m_strMessage reintun.:


char *InputString;                

    FILE *MeineDatei;


    MeineDatei = fopen("C:\\siso", "b");                

    while(!feof(MeineDatei))                

    {                        

        InputString = new char[409];                        

        fgets(InputString, 409, MeineDatei);                        

        m_strMessage = InputString;                        

        delete InputString;                

    }                

    fclose(MeineDatei);  


m_strMessage ist eine Membervariable (CString). Aber er sagt, irendwas von "unbehandelte ausnahme" beim Debuggen in der Zeile mit dem while, wenn ich die Datei von meiner Oberfläche aus einlesen will . Könnt ihr mir weiterhelfen? In der binären Datei ist ein 0x00, d.h. ein Stingendekennzeichen drin. CFile ist offenbar nicht so geeignet für meine Bedürfnisse. Weil wenn ich es so tu

CFile datei("C:\\siso",CFile::modeRead | CFile::typeBinary);  				

	int DateiLaenge =datei.GetLength();		

	//char* buffer = new char(DateiLaenge);	// Hat noch nicht richtig funktioniert!!

	char buffer[4096 + 1];

	datei.Read( buffer, 4096);			

	// Ganze Datei-Daten aus Datei in CString aus buffer

	m_strMessage = buffer;

	datei.Close();

Dann scheint er auch alles ab dem 0x00 zu überlesen und wegzuschmeißen.

Oder habt ihr vielleicht eine andere Idee wie sich sowas lösen läßt?

Thnx4Help

FaFo

[ 28. Juni 2001: Beitrag editiert von: FaFo ]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem liegt beim Rüberkopieren. Der Inputstring ist ein Pointer auf ein char-Array. Der CString selber kann ("zerhackt") im Speicher stehen. Ein Kopieren des Char-Arrays in den CString klappt so nicht und führt zum absoluten abfacken. Wichtig ist es den CString erstmal mit GetBufferSetLength(Länge des Inputstrings) einen durchgehenden Speicher mit der richtigen Länge am Stück zuzuweisen. Danach muß "von Hand" aus dem Char-Array in den CString reinkopiert werden.

Nochmal genau:

1.) char*pm_strMessage=m_strMessage.GetBufferSetLength(Bufferlänge) mit einer ausreichende Größe anwenden zurück kommt ein Pointer auf den String

3.) char* vom inputstring in einer Schleife byteweise in den m_strMessagePointer rüberkopieren

4.) Den 0er nicht vergessen beim CString anzufügen, sonst weiß ReleaseBuffer() nicht, wo der String endet und geht bis zum nächsten 0er im Speicher

5.) m_strMessage.ReleaseBuffer() aufrufen, damit die String-Länge in den CString übertragen wird und der Buffer wieder freigegeben wird. Danach den StringPointer von GetBufferSetLength() auf KEINEN FALL MEHR VERWENDEN!!!

Sollen 0er-Bytes im CString drin sein, dann mußt du noch vor dem Kopieren m_strMessage.LockBuffer() aufrufen um das Reference-Counting auszuschalten, allerdings ob ReleaseBuffer() dann den 0er akzeptiert weiß ich jetzt aus dem Kopf raus auch nicht mehr, muß ich selber erst mal testen.

Weil einfach CStrings keine char[] sind muß mein das leider so brutal angehn.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ups, 2) hab ich wohl irgendwie übersprungen ... war wohl nichts wichtiges (hehehe)

Aber wenn Du´s genau wissen willst, dann such mal die alten Foren durch, irgenwo hab ich das nochmal genauer erklärt, ich glaub sogar mit Sourcecode - ich bin jetzt aber zu faul danach zu suchen!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also ein String ist ein NULL-Terminiertes char-array.

Der in der CString-Klasse überladende = Operator versucht nun ähnlich strcpy dein char array als String in den CString buffer zu kopieren und zwar bis es auf ein '\0' Wert im Quellstring trifft.

Es kommt hier natürlich darauf an, was in der Datei steht.

Sind es wirklich nur Binäre Daten ist CString natürlich die falsche Wahl.

Handelt es um Text dem nur der \0 Abschluss fehlt müsstest du ihn noch per Hand setzen.

InputString= new char[410]; // +1 für \0

fgets(InputString, 409, MeineDatei);

InputString[409] = '\0';

m_strMessage = InputString;

usw.

Hoagi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich hab es jetzt folgendermaßen gelößt! Allerdings ist es aus einem Gesamtprojekt gelößt. Also lasst euch nicht in die irre leiten von m_Anzahl und so. Das sind die Membervariablen meines Dialogs.

 


int iLen;

	int iSent;

    CString m_strMessage;

    UpdateData(TRUE); /*Daten für die Anzahl aus dem Dialog holen*/


    if (m_Anzahl == 0) {AfxMessageBox("Bitte geben eine gültige Anzahl ein");}

    else

    {




        int nLen;

        CFile		datei;

    	CString		szBuffer;

    	DWORD		dwBufferLen;


    	BOOL bRet = datei.Open( "C:\\siso.", CFile::modeRead | CFile::typeBinary );

    	if( bRet )

    	{

            //Länge wird 

            dwBufferLen = datei.GetLength();


		    UINT uiRet = datei.Read( (void*)szBuffer.GetBuffer( (int)dwBufferLen ), dwBufferLen );


		    szBuffer.ReleaseBuffer( uiRet );


    		nLen = szBuffer.GetLength();


		    datei.Close();

	    }



		    // Zu sendende Nachricht vorhanden?

            if (dwBufferLen > 0)

		    {

    		    // Länge der Nachricht aus dem Laufindex der Schleife ermitteln

		        iLen = dwBufferLen;



                // Nachricht in der gewählten Anzahl senden

			    while (m_Anzahl>0)

                { 

                    iSent = m_sConnectSocket.Send(LPCTSTR(szBuffer), nLen);



			        // Konnte die Nachricht gesendet werden?

			        if (iSent == SOCKET_ERROR)

			        {

			        }

			        else

			        {


                    // Nachricht in Listenfeld hinzufügen.

			        //m_ctlSent.AddString(m_strMessage);

			        // Variablen mit Steuerelementen synchronisieren

    			    //UpdateData(FALSE);


                    }

                m_Anzahl--; 

                }


    		}

 		    else

		    {

		    MessageBox("Keine Daten in der Datei!");

		    }


    }

}

Hoffe jemand der das noch braucht sieht durch, sonst sei er verdonnert mich zu fragen. :D:D:D

Greetz

[ 02. Juli 2001: Beitrag editiert von: FaFo ]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...