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 : Beispiel

    Nach Auswahl eine neue Eingabe zu machen kommt folgendes:
    Test :
    Datum : Beispiel
    Zeit : Beispiel

    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.

    @daddy_felix

    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



  • @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.




Anmelden zum Antworten