zu viel daten in string?
-
Ich bin nicht sicher, ob das hier rein gehört, aber ich mach das einfach mal

zu mir: ich bin anfänger, hab zwar mittlerweile schon einige kenntnisse erworben, und schon viele ";" vergessen, aber mit diesem problem komme ich nicht zurecht.
falls es von interesse ist: ich verwende den neuesten borland compiler für kommandozeile.
dieses programm ist dazu gedacht eine art datenbank anzulegen. es soll so funktionieren:
1. das verzeichnis vom benutzer abfragen (es soll ein quiz werden, deshalb frage.diff (diff= difficult) )
2. frage abfragen, antwortmöglichkeiten abfragen
3. alles in eine datei schreibencompiliert wurde es fehlerfrei (mit ausnahme einer warnung, irgendwas mit inline)
bei der ausführung jedoch kommt es zu dem problem, dass je mehr buchstaben ich eingebe, desto mehr abfragen werden übersprungen!also gebe ich bei der frage nach der frage "was ist grün" ein und er überspringt die nächsten 3 abfragen nach den antwortmöglichkeiten und fährt mit
der abfrage nach der richtigen antwort fort.was habe ich falsch gemacht?
#include <string> #include <fstream> #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; struct eingabe { // zum speichern der eingabe zum späteren schreiben in datei int diff; string frage; string antwort1; string antwort2; string antwort3; string antwort4; }; class datei { private: bool schalter; eingabe frage; int verzeichnis[14]; // zum speichern der anzahl der dateien pro verzeichnis int counter; int verzeichniscounter; ifstream datlesen; ofstream datschreiben; char buffer[200]; char arbeitsverzeichnis[200]; public: datei() { verzeichniscounter = 1; while (verzeichniscounter < 16) { counter = 0; schalter = true; getcwd(arbeitsverzeichnis,sizeof(arbeitsverzeichnis)); while (schalter) { sprintf(buffer, "%s\\db\\%u\\%u.txt" ,arbeitsverzeichnis, verzeichniscounter, counter ); datlesen.open(buffer, ios_base::in); if (!datlesen) { schalter = false; verzeichnis[(verzeichniscounter-1)] = counter; counter = -1; } datlesen.close(); counter++; } verzeichniscounter++; } } void eingeben() { cout << "Gib den Schwierigkeitsgrad an!" << endl; cin >> frage.diff; fflush(stdin); cout << endl << "Gib die Frage ein!" << endl; cin >> frage.frage; fflush(stdin); cout << endl << "Gib die erste FALSCHE Antwort ein!" << endl; cin >> frage.antwort1; fflush(stdin); cout << endl << "Gib die ZWEITE FALSCHE Antwort ein!" << endl; cin >> frage.antwort2; fflush(stdin); cout << endl << "Gib die DRITTE FALSCHE Antwort ein!" << endl; cin >> frage.antwort3; fflush(stdin); cout << endl << "Gib die RICHTIGE Antwort ein!" << endl; cin >> frage.antwort4; fflush(stdin); cout << endl << endl << endl; } void schreibedatei() { sprintf(buffer, "%s\\db\\%u\\%u.txt",arbeitsverzeichnis, frage.diff, ( 1+(verzeichnis[(frage.diff-1)]) ) ); datschreiben.open(buffer, ios_base::out); if (!datschreiben) { cout << "fehler" << buffer << endl;} datschreiben << frage.frage << "\;" << frage.antwort1 << "\;" << frage.antwort2; datschreiben << "\;" << frage.antwort3 << "\;" << frage.antwort4 << "\;"; datschreiben.close(); } }; int main() { datei diefrage; diefrage.eingeben(); diefrage.schreibedatei(); return 0; }PS: verzeiht meine (komische ausdrucksweise), die fehlenden kommentare im quellcode, die ganze kleinschrift und ganz wichtig:
ich hatte leider keine zeit nach vorhandenheit eines ähnlichen themas zu suchen, also bitte keine unfreundlichkeiten...
Danke für eure Hilfe

-
Zum Problem: Wenn du einen String mit operator<< einliest, liest er nur bis zum nächsten Whitespace (z.B. Leerzeichen) ein, also bleiben die anderen Wörter noch im stream (und werden stück für stück ausgelesen in den nächsten Eingaben). getline wäre die Funktion, die du eventuell suchst.
Zu anderen Dingen:
- hier im Forum gibts die [cpp[i][i]]-Tags, die sorgen für Syntax-highlighting im Quellcode.- <stdio.h> und <stdlib.h> sind C-Header, die entsprechenden C++-header heißen <cstdio> und <cstdlib>
- <stdio.h> bzw. <cstdio> enhalten C-Style I/O, in C++ wird sowas normalerweise mit den streams gelöst, z.B. <fstream> mit std::fstream für Datei-I/O
- sprintf ist eine C-Funktion, die entsprechende Funktionalitt wird in C++ meist mit stringstreams (header <sstream>) umgesetzt. Die haben neben Typsicherheit und den Möglichkeiten, eigene Typen auszugeben bzw. in den Buffer zu schreiben, noch den Vorteil der meist besseren Lesbarkeit.
-
Danke, pumuckl! (ich habs noch nicht ausprobiert, wird aber stimmen)
In dem Buch, das ich gelesen habe, waren nur die verwendeten Funktionen aufgeführt.
Zu <stdio>/<stdio.h> und <stdlib>/<stdlib.h> muss ich gestehen, dass mir nicht bewusst war, dass dabei ein Unterschied besteht. Ich dachte es sind die selben verwendeten Dateien, bloss dass man sie einmal mit Dateiendung angeben kann und einmal ohne.- sprintf ist eine C-Funktion, die entsprechende Funktionalitt wird in C++ meist mit stringstreams (header <sstream>) umgesetzt. Die haben neben Typsicherheit und den Möglichkeiten, eigene Typen auszugeben bzw. in den Buffer zu schreiben, noch den Vorteil der meist besseren Lesbarkeit.
Kannst du (oder jemand anders) mir das mit den Stringstreams genauer erklären oder einen link zu einer Seite geben, wo das erklärt ist?
-
Silvan schrieb:
Kannst du (oder jemand anders) mir das mit den Stringstreams genauer erklären oder einen link zu einer Seite geben, wo das erklärt ist?
Für eine Referenzen und kurze Beispiele ist www.cplusplus.com die erste Anlaufstelle:
http://www.cplusplus.com/reference/iostream/stringstream/stringstream/
-
#include <iostream> #include <sstream> // für std::stringstream und std::istringstream und std::ostringstream #include <string> int main() { std::string zahl_als_text = "19"; int zahl_zum_rechnen = 0; std::stringstream umwandler; umwandler << zahl_als_text; umwandler >> zahl_zum_rechnen; std::cout << zahl_zum_rechnen << std::endl; return 0; }Siehe z. B. http://www.cplusplus.com/reference/iostream/stringstream/stringstream/ oder auch http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html