String Problem



  • Ok, sorry!
    Hab meinen Quellcode überarbeitet und herausgefunden, dass es an einem anderen Teilbereich lag, den ich aber zum Glück debuggen konnte!

    Tut mir leid, dass ich eure Zeit verschwendet habe.

    ThX für die Helfer!

    MFG n()()bi



  • n()()bi schrieb:

    Hallo Leute!
    Ich habe ein Programm, in dem ich ein paar CIN-Eingaben in eine .txt-Datei schreibe.

    Des Problem liegt am string - denke ich zumindesd, denn wenn ich mittels cin>> einen String mit Leerzeichen, ?, etc. eingebe, dann bricht das Programm automatisch ab. Woran liegt das Problem, ich denke mal an diesen "Sonderzeichen", aber wie löse ich dieses Problem ?

    Evtl. mit einer Filterfunktion, die Sonderzeichen mit "\" codiert ? Wie würdet ihr das lösen ?

    Hoffe jemand nimmt sich kurz zeit für mich ! MFG!

    n()()bi

    // Alles, was hier jetzt in C++ codiert steht, markierst Du einfach,
    // fügst es dann in Dem Editor Deiner IDE ein, und klickst auf kompilieren
    // oder, falls Du auch MS_VC++.net 2003 verwendest, auf Build Project.
    // Bei mir sind keine Fehler aufgetreten, und das Prog speichert jetzt
    // eben genau den String, den man im Edit Control eingegeben hat
    // Das sieht hier zwar jetzt ziemlich lang aus, aber wenn Du das in
    // Klassen packen anfängst, wird der Code wieder sehr kompakt und es ist
    // auf jeden Fall toller als mit den antiquierten Streams herum zu pfuschen.

    #include<windows.h>
    #define FDESSS FileDieEinenStringSpeichernSoll
    #define STOREBUTTONID 100
    #define STRINGEDITID 101
    #define BUTTONHEIGHT GetSystemMetrics(SM_CYMAXIMIZED)/10
    #define TEXTHEIGHT GetSystemMetrics(SM_CXMAXIMIZED)/10
    
    HWND stringreader;
    HWND writefilebutton;
    HFILE singlestringfile;
    char* WhatEverString;
    UINT TextLength;
    ULONG oddApplication;
    
    LRESULT CALLBACK MessageHandler(HWND hwnd,UINT imsg,
                                    WPARAM wParam,LPARAM lParam){
     switch(imsg){
       case WM_CREATE:
          // Hier erzeugen wir die beiden Controls, die wir brauchen:
          // ein Edit Control, in das der Anwender den String eingibt
          // und ein Button Control, mit dem er uns sagt, dass er den
          // String speichern möchte
    
          // Erst erzeugen wir das Edit Control das zum Einlesen des
          // Strings verwendet wird
          stringreader=CreateWindowEx(NULL,"edit",
                                      NULL,
                                      WS_VISIBLE|ES_LEFT|WS_CHILD,
                                      GetSystemMetrics(SM_CXMAXIMIZED)/10,
                                      GetSystemMetrics(SM_CYMAXIMIZED)/10,
                                      8*GetSystemMetrics(SM_CXMAXIMIZED)/10,
                                      TEXTHEIGHT,hwnd,(HMENU)STRINGEDITID,
                                      ((LPCREATESTRUCT)(lParam))->hInstance,
                                      NULL);
    
           // Dann erzeugen wir den Button 'Speichern', der uns signalisiert, dass
           // der User den String speichern möchte
          writefilebutton=CreateWindowEx(NULL,"button",
                                      "Speichern",
                                      WS_VISIBLE|BS_CENTER|WS_CHILD,
                                      7*GetSystemMetrics(SM_CXMAXIMIZED)/10,
                                      8*GetSystemMetrics(SM_CYMAXIMIZED)/10,
                                      2*GetSystemMetrics(SM_CXMAXIMIZED)/10,
                                      BUTTONHEIGHT,hwnd,(HMENU)STOREBUTTONID,
                                      ((LPCREATESTRUCT)(lParam))->hInstance,
                                      NULL);
           break;
    
        case WM_COMMAND:
             if(LOWORD(wParam)==STOREBUTTONID){ // Nur der Speicherbutton inter-
                                                // essiert uns hier
    
               // Erst öffnen wir einen Filehandle
               singlestringfile=(HFILE)CreateFile("Einzelstringdatei.txt", // Das
                                                   // ist natuerlich der Dateiname
                                 GENERIC_WRITE|GENERIC_READ,
                                 NULL, NULL,
                                 CREATE_ALWAYS, // Allerdings ist das auch ein
                                                // bisschen radikal
                                 FILE_ATTRIBUTE_NORMAL,
                                 NULL);
    
               // Dann finden wir heraus, wieviele Zeichen der Benutzer in
               // das Edit-Control hineingeschrieben hat
               TextLength=SendMessage(stringreader,WM_GETTEXTLENGTH,
                                      0,0);
               TextLength++; // Muss sein, um für das Schreiben in die Datei
                             // verwendet werden zu können
    
               // Davon machen wir abhängig, wie groß unser Textbuffer sein wird,
               // in dem wir den Text aus dem Edit Control zwischenspeichern
               WhatEverString=new char[TextLength];
               SendMessage(stringreader,WM_GETTEXT,
                           (WPARAM) TextLength, (LPARAM) WhatEverString);
    
               // Jetzt schreiben wir noch den String in die Datei
               WriteFile((HANDLE)singlestringfile,(LPCVOID)WhatEverString,
                        TextLength,&oddApplication,
                        NULL);
    
               // Und schließen den Filehandle wieder
               CloseHandle((HANDLE)singlestringfile);
               } // Ende der if-Bedingung
               break;
    
        case WM_DESTROY:
              PostQuitMessage(0);
              return 0;
        } // Ende der switch-Abfrage
     return DefWindowProc(hwnd,imsg,wParam,lParam);
    } // Ende der Hauptfensternachrichtenverarbeitungsfunktion
    
    // Nur noch eine 0815 Standard WinMain() für kleinere Aufgaben (z.B.
    // einen vereinzelten String in eine Datei schreiben)
    
    int WINAPI WinMain(HINSTANCE hinst,HINSTANCE phinst,
                       LPSTR commline, int ShowStyle){
    
     HWND mWnd;
     MSG msg;
     WNDCLASSEX wcl;
    
     ZeroMemory(&wcl,sizeof(wcl));
     wcl.hInstance=hinst;
     wcl.lpszClassName="hf"; // Hauptfenster;
     wcl.lpfnWndProc=MessageHandler;
     wcl.cbSize=sizeof(WNDCLASSEX);
     wcl.hCursor=LoadCursor(NULL,IDC_ARROW);
     wcl.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
    
     if(!RegisterClassEx(&wcl))
      return 0;
    
     mWnd=CreateWindowEx(NULL,wcl.lpszClassName,
                         "String in eine Datei schreiben",
                         WS_VISIBLE|WS_OVERLAPPEDWINDOW|WS_MINIMIZEBOX,
                         0,0,GetSystemMetrics(SM_CXMAXIMIZED),
                         GetSystemMetrics(SM_CYMAXIMIZED),
                         NULL,NULL,hinst,NULL);
    
    if(!mWnd)
     return 0;
    
    while(GetMessage(&msg,NULL,0,0)){ 
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
    
    return msg.wParam; 
    } // ENDE WinMain
    

    // Fehlerlos kompiliert vor einer Minute mit MS-VC++.net 2003

    Jedenfalls kannst Du dich dann z.B. mit dem Editor davon überzeugen, dass der String den Weg in die Datei gefunden hat, aber nach einer Lesefunktion war ja
    in Deinem Beispiel gar nicht gefragt. Das Programm benennt die Datei übrigens
    immer mit 'Einzelstringdatei.txt', weil wir der Bequemlichkeit halber
    auf eine Festlegung des Dateinamens durch den Anwender verzichtet haben (was
    aber bei einem vereinzelten String auszuhalten sein dürfte, ist ja nur eine
    Übung)

    Viel Spass beim Experimentieren mit dem Quellcode (jedenfalls musst Du die
    Funktionen hier früher oder später in Klassen packen, damit Du Dir nicht die
    Finger wund schreibst, wenn Du wieder einmal etwas mit Ein- Ausgabe in Dateien
    zu tun hast)

    Mit den besten Grüßen
    HansImSuff (== Mecnels am Freitag Abend)



  • Wieso wird hier im C++ Forum grausiger WinAPI-Code gepostet?



  • n()()bi schrieb:

    Hallo Leute!
    Ich habe ein Programm, in dem ich ein paar CIN-Eingaben in eine .txt-Datei schreibe.

    Des Problem liegt am string - denke ich zumindesd, denn wenn ich mittels cin>> einen String mit Leerzeichen, ?, etc. eingebe, dann bricht das Programm automatisch ab. Woran liegt das Problem, ich denke mal an diesen "Sonderzeichen", aber wie löse ich dieses Problem ?

    Evtl. mit einer Filterfunktion, die Sonderzeichen mit "\" codiert ? Wie würdet ihr das lösen ?

    Hoffe jemand nimmt sich kurz zeit für mich ! MFG!

    n()()bi

    So, da hab ich mir in meiner Freitag Abend Version sogar etwas mehr Zeit für Dein Problem genommen.



  • @HansImSuff

    was hat den DAS mit standard c++ zu tun? sieht mir ja eher nach MFC oder zumindest WINAPI aus

    dies als lösung zu 'n()()bs' problem ist ja wohl als f.a. zu sehen



  • interpreter schrieb:

    Wieso wird hier im C++ Forum grausiger WinAPI-Code gepostet?

    Der ist nicht grausig, der ist eben auch eine Spielvariante von C++. Und jedenfalls gibt's mit dem von mir vorgeschlagenen Code keine Probleme mehr mit gepufferter Eingabe 😃 😃 😃



  • Mecnels schrieb:

    interpreter schrieb:

    Wieso wird hier im C++ Forum grausiger WinAPI-Code gepostet?

    Der ist nicht grausig, der ist eben auch eine Spielvariante von C++. Und jedenfalls gibt's mit dem von mir vorgeschlagenen Code keine Probleme mehr mit gepufferter Eingabe 😃 😃 😃

    Falsch. Es geht total an einer guten Lösung vorbei und hat nichts mit Standard C++ zu tun.



  • enno-tyrant schrieb:

    @HansImSuff

    was hat den DAS mit standard c++ zu tun? sieht mir ja eher nach MFC oder zumindest WINAPI aus

    dies als lösung zu 'n()()bs' problem ist ja wohl als f.a. zu sehen

    Er braucht den Quelltext nur mit Copy & Paste in den Editor seiner IDE einzufügen und dann zu kompilieren, und schon ist sein Problem gelöst. GENAU DAS ist EFFIZIENTE HILFE, die sich sonst ja niemand antun will, weil das beim Thema Programmieren ARBEIT bedeutet.
    Jetzt lass mich mal raten,
    Enno-Tyrant, SimonPhoenix, Shade, MastaH, groovemaster, Interpreter
    -> Besucht Ihr etwa die selbe Uni dass man Euch immer an einem Strang ziehen sieht, wenn's drum geht, über einen wohlwollenden alten Branchenkollegen herzuziehen?



  • Irgendwie kommt mir gerade ein Spruch in den Sinn:
    "Alter schützt nicht vor Torheit" 🙄


  • Mod

    tja, wer braucht schon substanz, wenn man buttons haben kann :p



  • Ich würde vorschlagen Mecnels zu ignorieren. Wir posten weiterhin normale Hinweise und Lösungen und er kann dann seine WinAPI Sachen zeigen, die hier nur keinen interessieren.



  • Moin Mecnels!

    funktioniert dein Quellcode auch auf Linux-Kisten?? Sieht mir Windows mäßig aus. Brauch es aber für Linux...

    MFG!

    n()()bi



  • Mecnels schrieb:

    Er braucht den Quelltext nur mit Copy & Paste in den Editor seiner IDE einzufügen und dann zu kompilieren, und schon ist sein Problem gelöst. GENAU DAS ist EFFIZIENTE HILFE, die sich sonst ja niemand antun will, weil das beim Thema Programmieren ARBEIT bedeutet.

    n()()bi schrieb:

    Moin Mecnels!

    funktioniert dein Quellcode auch auf Linux-Kisten?? Sieht mir Windows mäßig aus. Brauch es aber für Linux...

    MFG!

    n()()bi

    owned 😃



  • Muss ein Fake sein.
    Im dritten Beitrag hat er was von XP geschrieben.

    Immer wenn ich Eingaben, die länger als eine Zeile sind eingebe, stürzt das Programm ab und es kommt "das Programm muss beendet werden, Problembericht an Microsoft senden" - Win XP ? Wie kann man dass lösen ?



  • vielleicht... schrieb:

    Ich würde vorschlagen Mecnels zu ignorieren. Wir posten weiterhin normale Hinweise und Lösungen und er kann dann seine WinAPI Sachen zeigen, die hier nur keinen interessieren.

    Es geht eigentlich um's Prinzip. Wenn ich hier als Anfänger her komme, und eine Frage habe, dann lassen sich die Antworten, von dem was ich hier gesehen habe, in diese Kategorien einteilen:

    1.) Lern erst einmal C++ - Typen (rund 30% der Antworten)

    2.) Nimm die STL - Typen (aber nicht genauer erläutern, sondern nur einfach STL
    hinschreiben, weil's momentan im Trend ist und man dann
    auch dazu gehört. Einem Anfänger mit einem konkreten
    Problem zu helfen, ist hier gar nicht die Absicht, es
    geht primär darum, sich selber zu profilieren - rund
    50% der Antworten sind vom Typ der_Antwortende_will_sich
    _vor_einem_Anfänger_profilieren)

    3.) Man nimmt das Problem ernst, und versucht es womöglich mit Quellcode
    zu beantworten (die restlichen 20% der Antworten) -
    wer so vorgeht (ich gehör auch zu dieser Kategorie) sieht
    sich dann ziemlich flott 'Geflamme' von Leuten des Typs 2)
    gegenüber, die alles besser wissen, aber keine besseren
    konkreten Lösungen anzubieten bereit sind (oder gar nicht
    dazu in der Lage sind).

    // Ist aber ganz sicher keine Schande, auch mal zur Gruppe 3 zu gehören,
    🙂



  • @Mecnels: Wenn wir es alle so wie du machen würden und fertigen Quellcode hinknallen dann würde er nie oder nur ganz langsam was dazulernen.



  • Du hast Gruppe4 vergessen:

    1. Unnütze Antworten von uneinsichtigen Leuten, die trotz der Hinweise von mehreren Leuten nicht einsehen wollen, dass ihre "Lösung" unbrauchbar ist.

    Und jetzt hör auf dich als Opfer zu sehen 👎



  • Mecnels, dann nimm dir auch die Zeit vernünftig zu programmieren. Dein Quelltext ist scheiße.



  • Mecnels schrieb:

    Er braucht den Quelltext nur mit Copy & Paste in den Editor seiner IDE einzufügen und dann zu kompilieren, und schon ist sein Problem gelöst. GENAU DAS ist EFFIZIENTE HILFE, die sich sonst ja niemand antun will, weil das beim Thema Programmieren ARBEIT bedeutet.

    effiziente hilfe?
    er möchte gerne c++ lernen. du gibst ihm einen fertigen quelltext der nichts mit seiner problemstellung zu tun hat. womit hast du ihm geholfen?

    CSS hat effiziente hilfe geleistet.

    CSS schrieb:

    getline(cin, NameOfString);

    seiner antwort zufolge hat er damit sein problem lösen können. mehr noch, er hat sogar erst etwas falsch gemacht und dann selbstständig einen lösungsweg gefunden. so lernt man, und nicht anders.

    Mecnels schrieb:

    [...]
    rund 50% der Antworten sind vom Typ der_Antwortende_will_sich
    _vor_einem_Anfänger_profilieren
    [...]

    dann sind also 50% aller antworten von dir?

    und noch was konstruktives. wenn du leuten helfen willst die winapi zu lernen. dann ist das doch super!
    aber dann tu das hier:

    WinAPI
    Wer auf MFC und VCL verzichten will und direkt echte Windowsprogramme ohne Overhead und Bibliotheken schreiben will: willkommen im Lande von WinMain!

    oder hier:

    MFC mit dem Visual C++
    Immer noch der am häufigsten verwendete: Visual C++. Fragen zum Compiler, zu den Dialogen und zu den MFC (Microsoft Foundation Classes), hier sind Sie richtig.

    dieses forum hat eine schöne aufteilung in themengebiete. warum musst du dann unbedingt dein wissen dort losweren, wo es beim besten willen nicht gefragt ist?

    C++
    Fragen zu bestimmen Funktionen und Abläufen in C++ (nach dem ISO-Standard), damit man mal erfährt, was pure virtual bedeutet, oder wie das mit den Templates und der STL geht. Bitte keine Fragen zu Windows/Linux-Programmierung hier posten!

    die beschreibung dieses unterforums ist imo unmissverständlich.

    wenn du nun aber ständig in eindeutig falschen unterforen schreibst und auf sachen antwortest die nicht gefragt wurden, sieht es für alle so aus als würdest du das nur machen um zu provozieren.

    also nochmal: schreib bitte in den unterforen winapi, mfc und rund um die programmierung. oder bist du etwa doch nur hier um zu provozieren und willst gar nicht wirklich helfen?



  • n()()bi schrieb:

    Moin Mecnels!

    funktioniert dein Quellcode auch auf Linux-Kisten?? Sieht mir Windows mäßig aus. Brauch es aber für Linux...

    MFG!

    n()()bi

    Seit wann kennt Linux File Extensions? Du sprachst doch von einer TXT Datei?
    (Und ich fall drauf rein und durchschau erst jetzt dass Ihr mich da schon wieder ärgern wolltet, alle zusammen. Muss ich mir noch gut überlegen ob ich die Linux - Version auch poste, weil nur dann ist das ja für Euch 'C++ Standard'. Toller 'Standard', der dann nur auf einem von zehn Rechnern funzt. Aber ich will mal nicht so sein ... Bis morgen)


Anmelden zum Antworten