Net-srac Geschrieben 28. Juni 2001 Geschrieben 28. Juni 2001 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 ] Zitieren
Crush Geschrieben 28. Juni 2001 Geschrieben 28. Juni 2001 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. Zitieren
Crush Geschrieben 28. Juni 2001 Geschrieben 28. Juni 2001 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! Zitieren
hoagi Geschrieben 1. Juli 2001 Geschrieben 1. Juli 2001 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 Zitieren
gajUli Geschrieben 1. Juli 2001 Geschrieben 1. Juli 2001 Kennt eigentlich irgendjemand eine gewisse Funktion namens fread()? Uli [ 02. Juli 2001: Beitrag editiert von: EisenUli ] Zitieren
Net-srac Geschrieben 2. Juli 2001 Autor Geschrieben 2. Juli 2001 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. Greetz [ 02. Juli 2001: Beitrag editiert von: FaFo ] Zitieren
Empfohlene Beiträge
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.