String Problem
-
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
-
getline(cin, NameOfString);
MfG CSS
-
ThX, dies funktioniert, doch nur, wenn die cin-Eingaben nicht länger als eine Zeile betragen ?! 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 ?
ThX nochmal!
n()()bi
-
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"
-
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:
- 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