char* new....
-
hallo
[code] char *pBuffer; pBuffer = new char; //.. //.. CFile::Read(pBuffer, length); //length = filesize in bytesMit der o.a. Funktion bekomme ich genau, den im File beinhalteten Text.
[code] char *pBuffer; pBuffer = new char [length]; //.. //.. CFile::Read(pBuffer, length);Mache ich es so, ist mein pBuffer auf einmal viel länger, als in length vorgegeben. Nach dem Inhalt von File steht nur noch Müll drin.
warum?
-
Ich würde eher vermuten, daß der Datenmüll schon vorher in deinem Puffer lag - Wenn Read() kein Abschlußzeichen ('\0') an die Daten gehängt hat (bei binärer Ein/Ausgabe sehr wahrscheinlich), kommen hinter deinen Daten zufällige Werte, die vorher schon im Speicher standen.
btw, deine erste Variante ist sehr gefährlich, da du dort auf Speicher zugreifst, den du nicht reserviert hast - "pBuffer=new char" holt sich Platz für genau EIN Zeichen, der anschließende Read()-Aufruf schreibt in Speicher, der offiziell als unbenutzt gilt (oder gar von anderen Programmteilen belegt wurde).
-
Gut...
wenn nun aber pBuf folgendermaßen init. wird:size_t length = 20; char* pBuf; pBuf = new char[length]; //... File::Read(pBuf, length);und am Filende nicht nur ein '\0', sondern auch ein EOF steht, warum
steht dann im meinem pBuf....
ab Stelle[23] bis etwa 15 Stellen danach nur Müll?
-
Die Position pBuffer[23] gehört gar nicht mehr zu deinem Puffer, sondern enthält das, was dort zufälligerweise gerade stand - du hast gerade 20 Zeichen gelesen, also darfst du auch nur im Bereich pBuffer[0] bis pBuffer[19] sinnvolle Werte erwarten.
-
Das ist mir schon klar.
Nur, wenn ich nach dem Lesen pBuf in einen CString wadndle, habe ich den Müll auch
im CString drinstehen.
Also: wenn buffer[20],
steht im Speicher and Stelle buffer[20] irgendwas - klar.
Mache ich aber:
CString str = buffer;
warum steht dann dort der Müll von buffer[20]??
-
Theresa_Orl schrieb:
warum steht dann dort der Müll von buffer[20]??
Weil alle Stringfunktionen davon ausgehen, dass sie mit nullterminierten Daten arbeiten. Deinen Daten sind nicht nullterminiert.
-
Das wars.
Danke für die Hilfe
-
reservier doch Platz für ein zusätzliches Zeichen und schreib dir selber eine 0 dahinter.
pBuffer = new char[length+1] int ct=file.Read(pBuffer,length); pBuffer[ct]='\0';Danach kannst du den Bereich auch an deine String-Klasse weitergeben.
Alternativ hat CString auch einen Konstruktor, der die Länge des Zielbereiches erwartet:
int ct=file.Read(pBuffer,length); CString s(pBuffer,ct);Dritte Möglichkeit wäre es, statt CFile ein CStdioFile zu verwenden und die Daten mittels ReadString() ohne Umwege über deinen char*-Puffer einzulesen.
PS: Und ich empfehle dir, solche Fragen im MFC-Board zu stellen - es geht schließlich um MFC-spezifische Klassen
