in CString steht nur einer statt 3 Buchstaben



  • Hallo Ihr,

    komische Begebenheit: ich hab eine Zuweisung in meinem Quelltext, die eigentlich ganz einfach ist, aber dennoch kommt hinterher irgendwie Müll raus.
    Der entsprechende Ausschnitt:

    CString monat;
    char text[1500];
    ...
    SYSTEMTIME ti;
    GetLocalTime(&ti);
    ...
    if (ti.wMonth==11) { monat="Nov"; }
    ...
    sprintf(text, "Monat:  %s ", monat);
    

    Meine Ausgabe: N

    Also nur ein Buchstabe und zwar der erste. Woran könnte das wohl liegen ??? Also ich bin völlig sprachlos. Der Rest des Quelltextes beeinflusst die Variable text oder monat übrigens nicht mehr.



  • Wo passiert die Ausgabe? 🙂



  • Wobei... halt ! Ist nicht ganz richtig: natürlich wird in text noch etwas anderes geschrieben, ansonsten wäre es nicht [1500]-groß. Aber das Prinzip stimmt auf jeden Fall so. Im Originalquelltext stehen sensible Daten, daher kann ich ihn nur in abgewandelter Form posten. Aber wie gesagt: vom Aufbau und Prinzip identisch.
    Der Compiler zeigt übrigens keinen Fehler und keine Warnung an !



  • Ach so, die Ausgabe, ja, stimmt, das fehlt noch. text wird in eine Datei geschrieben mit fprintf(). Alles andere was ich da in text schreibe. Also alle anderen chars und integer und so weiter, werden richtig in text geschrieben obwohl sie in genau der gleichen sprintf()-Anweisung zugewiesen werden.



  • Hast du mit dem Debugger schon mal Schritt für Schritt verfolgt, wie text gefüllt wird?
    Vielleicht ist es ein einfacher Fehler, den man hier nicht sehen kann.



  • warum mischst du so komisch char* mit CString? Bau alles auf CString auf und nur dort, wo es nicht anders geht, wandelst du um.
    Und selbst da reicht meistens der implizite Cast von CString zu LPTSTR. Also weg mit diesem sprintf-Zeugs



  • wenn man CFile, bzw CStdioFile benutzt muss man für die ausgabe in eine Datei auch nicht umwandeln



  • @ Pallaeon: ich benutze sprintf weil es das einzige ist was bei mir irgendwie problemlos funktioniert. Ich finds auch kompliziert und umständlich, bin aber noch ziemlich neu in der C++-Szene. Ansonsten hätte ich gern eine Funktion mit der ich alles was ich so habe (chars, integers und CStrings) problemlos in text schreiben kann. Oder eben ganz einfache Wandlungsfunktionen. Aber das ist ja alles so endlos kompliziert und mit grausam viel Quellcode verbunden in C++ (bin einfachere PHP- und Perl-Programmierung gewohnt).
    LPTSTR funktionierte bei mir nicht.



  • Wenn du 2 Strings aneinanderfügen willst benutzt + oder +=



  • Benutz' doch die CString-eigene Format()-Methode dafür (die arbeitet sogar mit den selben Formatkennungen wie printf())



  • Also Leute, belese mich gerade über CFile, denn das kannte ich noch gar nicht. Bin ich wohl immer irgendwie drum rum gelaufen. Aber damit ist es dann nicht ganz getan. Ich hab sprintf nämlich genommen, weil ich damit aus allen Krams den ich zusammenfügen muss, zusammenfügen konnte. Bsp.: "Stefan ist 20 Jahre alt": sprintf(text, "%s ist %i Jahre alt", name, alter);
    So etwas brauche ich also. Mit den + Operatoren (mit denen man Strings zusammenfügen kann) ist es also da nicht so ganz getan !



  • wenn du CStrings zusammen bringen willst nimm +, wenn du Zahlen umwandeln willst nimm CString::Format



  • Für Textdateien bietet sich dann auch noch CStdioFile an. 🙂



  • Lies mal mit 😉

    CStoll schrieb:

    Benutz' doch die CString-eigene Format()-Methode dafür (die arbeitet sogar mit den selben Formatkennungen wie printf())

    d.h. dein Beispiel könnte man auch schreiben als:

    CString name="Stefan";int alter=22;
    //...
    CString text;
    text.Format("%s ist %i Jahre alt", name, alter);
    


  • Jetzt hab ich auch mal ne Frage hier in die Runde:
    Aber kann ich denn str nach den folgenden Operationen noch problemfrei in eine txt-Datei schreiben ? ich denke CString ist nur zur Ausgabe auf Bildschirmen (--> "Visual")

    CString str = "Some Data";
    str.Format(_T("%s%d"), str, 123) );



  • CString ist eine Klasse zur String-Verwaltung in erster Linie. Wo man den String benutzt, ist Sache des Programmieres(also egal ob man es auf dem Bildschirm ausgibt oder in ne Datei schreibt)



  • richtig.

    Was würde ein String nutzen, der nur zur Ausgabe auf dem Bildschirm genutzt werden kann 😕



  • So, Leudde, da hab ich schon wieder den Salat. Gleiche Fehlermeldung, wie sonst auch, wenn ich diese str.Format-Zeugs benutzt habe.

    Folgenden Code hab ich nu:

    CString monat, text;
    int zahl; 
    ... 
    SYSTEMTIME ti; 
    GetLocalTime(&ti); 
    ... 
    if (ti.wMonth==11) { monat="Nov"; } 
    ... 
    text.Format("Monat:  %s  Zahl: %i", monat, zahl);    // zeile 231
    ...
    

    Und folgende Fehlermeldung dazu

    c:\dokumente und einstellungen\test\desktop\test\c++\test.cpp(231) : error C2664: 'void __cdecl CString::Format(const unsigned short *,...)' : cannot convert pa
    rameter 1 from 'char [242]' to 'const unsigned short *'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast



  • ... also bei mir funktioniert es



  • mach mal "%d" anstatt "%i"


Anmelden zum Antworten