CString verliert Daten in einer Schleife
-
Nein, in der "fscan" Zeile kann das ja nicht gehen, da hier ja was *geschrieben* wird und nicht gelesen!!! Hier bitte "GetBuffer" verwenden!!!
-
Macht denn der operator LPCTSTR nicht genau das selbe? Und sollte man nicht besser GetBufferSetLength() verwenden?
-
Der zurückgegebene Zeiger ist *const* somit darf dieser nicht verändert werden!!! Ganz unabhängig davon wie CString implementiert ist!!! Und die Implementierung kann sich auch ändern!
-
GetBufferSetLength wäre in diesem Fall überflüssig. In jedem Fall müsstest Du aber ReleaseBuffer später aufrufen.
-
Martin Richter schrieb:
In jedem Fall müsstest Du aber ReleaseBuffer später aufrufen.
bei nur-lesezugriffen braucht man's aber nicht...

-
Ist der fcanf()-Aufruf ein Nur-Lese-Zugriff?
-
CStoll schrieb:
Ist der fcanf()-Aufruf ein Nur-Lese-Zugriff?
ach es geht um 'fscanf'? naja, das sieht sowieso verdächtig aus.
wieviel speicherplatz hat denn ein frischer CString, wenn man da einfach was 'reinscanfen' will?
-
Würde mich auch interessieren, deshalb auch der Vorschlag mit GetBufferSetLength().
-
Ein frischer String hat 0 Zeicen platz. Und der interne Zeiger verweist auf einen const Speicherbereich.
Ohne GetBuffer/GetBufferSetLength wird kein Speicher allokiert!
-
Martin Richter schrieb:
Ohne GetBuffer/GetBufferSetLength wird kein Speicher allokiert!
man muss also GetBuffer einen wert mitgeben, damit der CString speicher bekommt. wo ist dann der unterschied zu GetBufferSetLength()?
-
Heißt, daß GetBuffer auf einen Speicherbereich mit der Länge 0 verweisst wenn vorher nichts im String stand?
-
Nein!
GetBuffer(0) liefert Speicher mit einem Byte auf das man schreiben kann!
Dieses eine Byte ist das terminierende 0 Zeichen!
-
Martin Richter schrieb:
Nein!
GetBuffer(0) liefert Speicher mit einem Byte auf das man schreiben kann!
Dieses eine Byte ist das terminierende 0 Zeichen!ich habe zwar herzlich wenig ahnung von C++, aber ich werde das gefühl nicht los, dass 'CString' im hinblick auf gutes C++ design ziemlicher mist ist...

-
pale dog schrieb:
ich habe zwar herzlich wenig ahnung von C++, aber ich werde das gefühl nicht los, dass 'CString' im hinblick auf gutes C++ design ziemlicher mist ist...

Begründung?
CString verhält sich wie dokumentiert und wrapped null terminiert Strings perfekt. Und sogar mit Doppelnull-Strings kann das Ding umgehen.
-
Martin Richter schrieb:
pale dog schrieb:
ich habe zwar herzlich wenig ahnung von C++, aber ich werde das gefühl nicht los, dass 'CString' im hinblick auf gutes C++ design ziemlicher mist ist...

Begründung?
na, du siehst doch selbst an den letzten beiträgen. ich finde es nicht gut, wenn man in den daten eines objekts direkt herumwurschteln kann. meiner meinung nach dürfte ein 'GetBuffer()' bestenfalls einen 'const char*' zurückgeben. wer strings über char* verändern will, kann ja arrays benutzen...
-
Eigentlich ist die ganze Diskussion nur für die Theorie.
Warum sollte man MFC verwenden wenn man dann erst funktionen wie fopen, fscanf, etc. verwendet.
Da hat die MFC auch ganz gute Klassen um in Dateien zu schreiben und das ohne herum zu casten oder Zeiger zu übergeben.
-
pale dog schrieb:
na, du siehst doch selbst an den letzten beiträgen. ich finde es nicht gut, wenn man in den daten eines objekts direkt herumwurschteln kann. meiner meinung nach dürfte ein 'GetBuffer()' bestenfalls einen 'const char*' zurückgeben. wer strings über char* verändern will, kann ja arrays benutzen...
Wieso? Gerade das ist eine der Stärken von CString. Man kann Speicher allokieren und ihn durch eine API Funktion füllen lassen. Das hierbei Vorsicht geboten ist versteht sich. std::string hat hier einfach den Nachteil das immer kopiert werden muss und Stack-/Heapspeicher zwischenverwendet werden muss.
-
Martin Richter schrieb:
pale dog schrieb:
na, du siehst doch selbst an den letzten beiträgen. ich finde es nicht gut, wenn man in den daten eines objekts direkt herumwurschteln kann. meiner meinung nach dürfte ein 'GetBuffer()' bestenfalls einen 'const char*' zurückgeben. wer strings über char* verändern will, kann ja arrays benutzen...
Wieso? Gerade das ist eine der Stärken von CString. Man kann Speicher allokieren und ihn durch eine API Funktion füllen lassen. Das hierbei Vorsicht geboten ist versteht sich. std::string hat hier einfach den Nachteil das immer kopiert werden muss und Stack-/Heapspeicher zwischenverwendet werden muss.
okay, hast ja recht. es ist wie so oft eine gratwanderung zwischen gutem OO design und maximaler brauchbarkeit. beides arbeitet gegeneinander

hab' mal gehört dass man sogar mit zwei oder mehr CStrings auf ein und denselben buffer verweisen kann...
-
pale dog schrieb:
okay, hast ja recht. es ist wie so oft eine gratwanderung zwischen gutem OO design und maximaler brauchbarkeit. beides arbeitet gegeneinander

hab' mal gehört dass man sogar mit zwei oder mehr CStrings auf ein und denselben buffer verweisen kann...So ist es. Intern benutzt CString ein Referenz Counting System. Das Kopieren eines String kostet keine Allokation!