Array lässt sich kein zweites Mal füllen
-
Hallo liebe Community,
ich bin kompletter Neuling in Cpp, sowieso auch in diesem Forum. Als Anfangsaufgabe versuche ich gerade eine Art Kalender zu Coden, welcher einfach die Informationen vom Anwender übernimmt und in einer Textdatei speichert. Leider führt das zu einem unerwünschten Nebeneffeckt, welchen ich leider nicht raus bekomme.
Im Prinzip soll der Anwender nur den Text, das Datum und die Uhrzeit eingeben und das Programm speichert alles in einer Textdatei. Danach hat der Benutzer die Wahl einen zweiten Eintrag zu machen. Möchte er dies tun startet meine Schleife.
Es wird wieder nach dem Text gefragt aber direkt zum Datum gesprungen, ehe man die Chance hat einen Text einzugeben.Wäre nett wenn mir jemand weiterhelfen könne ohne zu hart mit mir ins Gericht zu
gehen, da ich mir sicher bin einige Fehler oder "No-Goes" begangen zu haben.Hab versucht den Code so übersichtlich und kurz wie möglich zu gestalten

int main(int argc, char *argv[]) { bool bEndauswahl = true; while (bEndauswahl) { char myArray[81]; cout << "Geben Sie die Nachricht fuer Ihren Kalendereintrag ein: "; cin.getline (myArray, 81); myArray[-1] = 0; std::cin.clear(); string dateline, day, month, year; cout << "An welchem Tag soll der Termin stattfinden: "; getline(cin, dateline); istringstream is(dateline); getline(is,day,'.'); getline(is,month,'.'); getline(is,year); string timeline, hour, minute; cout << "Geben Sie die Uhrzeit Ihres Termins an: "; getline (cin, timeline); istringstream is1(timeline); getline (is1, hour, ':'); getline (is1, minute); ifstream FileTest("L:/Thomas/C++/Datapool/Kalender.txt"); if(!FileTest) { ofstream myFile ("L:/Thomas/C++/Datapool/Kalender.txt", ios::out); if (!myFile) { cout << "Datei konnte nicht erstellt werden"; } else { myFile << day << "." << month << "." << year << " " << hour << ":" << minute << " | " << myArray << endl; myFile.close(); } } else { fstream myFile ("L:/Thomas/C++/Datapool/Kalender.txt", ios::out | ios::app); myFile << day << "." << month << "." << year << " " << hour << ":" << minute << " | " << myArray << endl; myFile.close(); } cout << "M\x94 \bchten Sie einen weiteren Eintrag machen? <J/N> "; string charAbfrage; cin >> charAbfrage; if((charAbfrage != "J") && (charAbfrage != "j")) { bEndauswahl = false; } } // system("PAUSE"); }
-
was denn für einen fehler?
was erwartest du und was kommt tatsächlich raus?wieso benutzt du in zeile 7 ein char array aber sonst einen (std::)string ?
wieso nicht da auch std::string?
-
und was genau erwartest du von der Zeile
myArray[-1] = 0;
-
Array lässt sich kein zweites Mal füllen
Na klar. Es ist ja auch schon voll. xD
*SCNR*

Würde jetzt auch noch gerne eine kompetente Antwort geben, aber muss gerade los. Sorry.

-
@Skym0sh0
Was ich möchte ist, dass der Benutzer einen zweiten Eintrag machen kann wenn er möchte.Erste Eingabe sieht so aus:
Text : Beispiel
Datum : Beispiel
Zeit : BeispielNach Auswahl eine neue Eingabe zu machen kommt folgendes:
Test :
Datum : Beispiel
Zeit : BeispielEr gibt mir im zweiten Durchlauf keine Chancen, den Text für den Eintrag anzugeben. Er fragt zwar danach, springt dann aber direkt weiter um nach dem Datum zu fragen, ohne eine Eingabe abzuwarten.
Hab gelesen das Strings immer mit einer 0 abgeschlossen werden und dies wollte
ich damit machen.
-
Aber -1 ist ja der Index vor dem ersten Index, das ist überhaupt kein gültiger Eintrag. Dachtest Du, das ist dann am Ende?
Also wenn Du oben einfach statt cin.getline(...) ebenfalls getline(cin, ...) nutzt, kannst Du direkt den String angeben. Und std::strings sind eh nullterminiert.
Und möglicherweise löst das auch Dein Überspringproblem.
-
@Eisflamme : Ja blöderweise habe ich wirklich gedacht es wäre der letzte Index o.O
Wenn ich ehrlich bin habe ich auch nie infrage gestellt ohne Array zu arbeiten.
Einmal geschrieben war es quasi gesetzt und wurde nicht mehr von mir hinterfragt
Danke schonmal für den DenkanstoßAber was bleibt:
Wenn ich die cin.getline Sache z.B. so abändere:
string sText; cout << "Geben Sie die Nachricht fuer Ihren Kalendereintrag ein: " << endl; getline(cin, sText);Bleibt immer noch der selbe Fehler

-
Samp schrieb:
Er gibt mir im zweiten Durchlauf keine Chancen, den Text für den Eintrag anzugeben. Er fragt zwar danach, springt dann aber direkt weiter um nach dem Datum zu fragen, ohne eine Eingabe abzuwarten.
Das tut er deshalb, weil Du in Zeile 57 zwar die Antwort von std::cin liest aber nicht das Ende der Zeile. Letzteres steht noch im Eingabestream und wird nach einer positive Antwort in Zeile 16 als leerer Eintrag gelesen.
Füge zwischen den Zeilen 8 und 9 ein
cin >> ws;ein.
Gruß
Werner
-
Super ich danke dir vielmals. Genau das war das Problem und ich hätte
auf ewig an der falschen stelle gesucht.Wenn du noch kurz Zeit hättest, würde ich gerne wissen was genau durch
cin >> ws; passiert?ps: Achja bevor ich es vergesse. Großes Lob ans Forum! Schnelle und produktive Antworten sucht man im Netz oft vergebens. Schön das es hier anders war

-
Samp schrieb:
Wenn du noch kurz Zeit hättest, würde ich gerne wissen was genau durch
cin >> ws; passiert?Der Ausdruck liest alle White Space Character. Siehe auch std::ws. Falls dann noch Fragen bleiben, bitte melden.
Samp schrieb:
ps: Achja bevor ich es vergesse. Großes Lob ans Forum! Schnelle und produktive Antworten sucht man im Netz oft vergebens. Schön das es hier anders war

ja das freut uns - also Willkommen im C++-Forum!
Ansonsten kannst Du noch die Zeilen 29 bis 53 durch
{ ofstream myFile ("L:/Thomas/C++/Datapool/Kalender.txt", ios::app); // ios::out ist unnötig, ein ofstream hat immer ios::out myFile << day << "." << month << "." << year << " " << hour << ":" << minute << " | " << myArray << endl; }ersetzen.
das tut genau das gleiche, wie der ganze Rest.
Gruß
Werner
-
system("PAUSE")müßtest Du Dir überlegen, ob das sinnvoll ist, da das ausschließlich unter Windows
funktioniert.
Eine Alternative wäre evtl.:cin.clear(); cin.ignore(256, '\n'); cout << "Weiter mit Return..." << endl; cin.get();Eine andere Frage wäre, ob das verwendete c-array sinnvoll ist.
Weiß gerade nicht, ob die Anzahl der zu speichernden Werte von vornherein fix ist. Falls nicht, wäre ein std::vector besser, Infos kannst Du unter
http://www.cplusplus.com/reference/stl/vector/push_back/ nachlesen.Und es wäre schön, wenn Du die c++-tags zum posten von Code benutzt, das ist
dann noch lesbarer.
-