Umstellung ofstream/ifstream - MemoryStream
-
Hallo,
ich möchte in einer Anwendung von oftream/ifstream auf MemoryStream umstellen.
Dazu habe ich die beiden folgenden Methoden ...// Schreiben (ofstream) ofstream outUP( (gasArbeitsVerz_Data + "\\" + asDateiName).c_str(), ios::binary); for (size_t i=0; i<gvUebungPruefung.size(); i++) { outUP.write( (char*) &gvUebungPruefung[i], sizeof(gvUebungPruefung[i])); } outUP.close(); // Lesen (ofstream) gvUebungPruefung.clear(); TUebungPruefung sctUP; // Struktur ifstream inUP((gasArbeitsVerz_Data + "\\" + asDateiName).c_str(), ios::binary); while (inUP.read((char*)&sctUP, sizeof(sctUP))) { gvUebungPruefung.push_back(sctUP); } inUP.close();... wie folgt umgestellt ...
// Schreiben (MemoryStream) TMemoryStream* Source; for (size_t i=0; i<gvUebungPruefung.size(); i++) { Source->WriteBuffer( (char*) &gvUebungPruefung[i].iID_Protokoll, sizeof(gvUebungPruefung[i].iID_Protokoll) ); Source->WriteBuffer( (char*) &gvUebungPruefung[i].dtDatum, sizeof(gvUebungPruefung[i].dtDatum) ); Source->WriteBuffer( (char*) &gvUebungPruefung[i].cBenutzer_VN, sizeof(gvUebungPruefung[i].cBenutzer_VN)); // usw. } // Lesen (MemoryStream) TMemoryStream* Dest; while (1) // endlos; benötigt also Abbruchkriterium { if(! Dest->ReadBuffer((byte*)&sctUP.iID_Protokoll, sizeof(sctUP.iID_Protokoll)) ){break;} if(! Dest->ReadBuffer((byte*)&sctUP.dtDatum, sizeof(sctUP.dtDatum)) ){break;} if(! Dest->ReadBuffer((byte*)&sctUP.cBenutzer_VN, sizeof(sctUP.cBenutzer_VN)) ){break;} }Die Methode zum Schreiben wird kompiliert, bei der Lese-Methode erscheint die Fehlermeldung:
E2109 Kein zulässiger TypDie Fehlermeldung taucht in folgender Zeile auf:
if(! Dest->ReadBuffer((byte*)&sctUP.iID_Protokoll, sizeof(sctUP.iID_Protokoll)) ){break;}Was mache ich falsch?
Gruß
Leo
-
hm ich könnte verstehen, wenn beides nicht funktioniert, da sowohl ReadBuffer() als auch WriteBuffer() einen Zeiger auf einen void*-Buffer erwarten.
-
Joe_M. schrieb:
hm ich könnte verstehen, wenn beides nicht funktioniert, da sowohl ReadBuffer() als auch WriteBuffer() einen Zeiger auf einen void*-Buffer erwarten.
Hi,
hilf' mir doch bitte gerade mal auf die Sprünge. Was ist ein void*-Buffer und wie könnte eine exemplarische Zeile in Zusammenhang mit Stream aussehen.
Gruß
Leo
-
Ich nehme an, er kennt den Datentyp 'byte' nicht, nimm doch in der Lesemethode auch 'char'.
-
Th schrieb:
Ich nehme an, er kennt den Datentyp 'byte' nicht, nimm doch in der Lesemethode auch 'char'.
Hi,
char anstellen von byte ändert leider nichts am Ergebnis.
Es würde mir sicher schon 'ne Menge helfen, wenn jemand zeigen könnte, wie die ReadBuffer() bzw. WriteBuffer-Geschichte mit einem void*-Buffer beispielhaft aussehen könnte. Idealerweise mit nicht nur mit Datentyp int, sondern auf jeden Fall char[z.B. 20].
Gruß
Leo
-
Hier ein kleines Beispiel:
TFileStream* myfs = NULL; char* myfsbuf = NULL; int myfsbuf_size = 1024; int myfsbuf_read; try { try { myfs = new TFileStream(asFileNameAndPath, fmOpenRead); myfsbuf = new char[myfsbuf_size]; myfs->Position = 0; do { myfsbuf_read = myfs->Read((void*) myfsbuf, myfsbuf_size); // hier wird die char* in ein void* gecastet // Daten auswerten } while (myfsbuf_read == myfsbuf_size); } catch(...) { ShowMessage("Fehler beim Lesen der Datei."); } } __finally { if (myfs) delete myfs; if (myfsbuf) delete[] myfsbuf; }Stör dich bitte nicht an der seltsam anmutenden Abbruchbedingung. Das war nur ein Versuch und es funktioniert. In einem richtigen Projekt würde ich sie allerdings so nicht verwenden.
-
Hallo,
Wenn du Read statt ReadBuffer verwendest mußt du nicht nach void* casten. Hier geht auch das blanke char* Array. Lediglich ReadBuffer verlangt einen void-Pointer. Wobei ReadBuffer auch bloß wieder Read aufruft.
Ciao
-
Funktioniert zwar, ist aber nicht dokumentiert...