DeMon Toll Geschrieben 7. August 2008 Geschrieben 7. August 2008 Moin allerseits ich habe ein Problem in C++, und zwar..... soll eine Eingabe solange eingelesen und überschrieben werden bis jemand die Enter Taste drückt. Die ganze Geschichte soll dann als Datenfeld in eine Text datei geschrieben werden. Mein gedanke war das per while schleife zu tun ich denke mal das ist auch nich sooo verkehrt aber nun die frage wie sage ich ihm das er nur bis zurbetätigung der Enter Taste einlesen soll. Ich hörte das soll per ASCII Code gehen. Nur wie baue ich das ein und wie ist der ASCII Code der Enter Taste.^^ Wär super wenn ihr mir nen tipp geben könntet. so long DeMon Zitieren
Hexagon Geschrieben 7. August 2008 Geschrieben 7. August 2008 Moin. So vielleicht? >>Klick mich, ich bin ein zwei SekundenSuchergebnis<< Zitieren
DeMon Toll Geschrieben 7. August 2008 Autor Geschrieben 7. August 2008 (bearbeitet) Moin Hexa, k....nur wie bau ich das ein?.....In aller regel wird das doch mit Backshlash (\) gemacht oder?! Hier mal der Beispiel code: while (Produktname != ?){ int i++; cin >> Produktname[i]; Wbest << Produktname[i]; Wbest.close(); } Habs auch schon mit ' probiert aber kein Erfolg =/ so long DeMon Bearbeitet 7. August 2008 von DeMon Toll Zitieren
Guybrush Threepwood Geschrieben 7. August 2008 Geschrieben 7. August 2008 was meinst du mit "überschrieben werden"? Das solange eingelesen wird bis Enter gedrückt wird ist eigentlich das übliche Verhalten, einfach cin>>deineVariable. Deine Beispielschleife macht für mich jetzt jedenfall nicht viel Sinn Zitieren
DeMon Toll Geschrieben 7. August 2008 Autor Geschrieben 7. August 2008 Nunja durch das Hochzählen von i schreibt er ja jedesmal in ein anderes Feld. Sprich Produktname[1] schleifendurchlauf Produktname[2] schleifendurchlauf....usw.. Sodass beim Wort Hallo: H <- Produktname[1], A <- Produktname[2] usw. in das Feld geschrieben wird. Am ende wird das char Datenfeld dann in die Textdatei geschrieben^^. Soweit mal die Theorie xD. Das mit dem Schreiben und dem ++ funktioniert auch nur wie gesagt hänge ich bei der Enter Tasten abfrage^^. so long DeMon Zitieren
Guybrush Threepwood Geschrieben 7. August 2008 Geschrieben 7. August 2008 Und wo wird da jetzt was überschrieben :confused: Ansonsten halt wie gesagt: string Produktname; cin>>Produktname; Wbest << Produktname; Wbest.close(); [/PHP] Fertig. Statt string könntest du auch ein char Array nehmen aber dann bekommst du mit cin Probleme sobald ein längerer Text eingegeben als dein Array lang ist und du müsstest eine andere Funktion nehmen welche die Eingabe begrenzt. cin.get oder getline glaube ichwars unter C++. Aber da du ja eh C++ benutzt gibt es keinen Grund string nicht zu verwenden. Zitieren
Hexagon Geschrieben 8. August 2008 Geschrieben 8. August 2008 Moin! k....nur wie bau ich das ein?.....In aller regel wird das doch mit Backshlash (\) gemacht oder?! Wie meinen? Hier mal der Beispiel code: Dann wollen wir mal schauen... while (Produktname != ?){ Ah ja... was ist Produktname? string? char-Array? Ansammlung willkürklicher Speicherbereiche? int i++; Blödsinn, da i bei jedem Schlaufendurchlauf neu angelegt, aber nicht intitialisiert und um 1 erhöht wird. -> Unvorhergesehbares verhalten. cin >> Produktname[i]; Das schaut doch schon fast gut aus. Wbest << Produktname[i]; Keine Ahnung was Wbest ist... Wbest.close(); } ... aber scheinbar etwas was man schließen kann. Habs auch schon mit ' probiert aber kein Erfolg =/ Das ist schön. Meine Kristallkugel sagt mir das da irgendwas falsch ist. Kann sein das ich schon Betriebsblind bin, aber aus diesen Informationen kann ich mir leider nichts zusammen reimen. Ansonsten würde ich sagen, daß der Tipp vom Piraten schon in die richtige Richtung geht. Zitieren
TDM Geschrieben 8. August 2008 Geschrieben 8. August 2008 Moin Hexa, k....nur wie bau ich das ein?.....In aller regel wird das doch mit Backshlash (\) gemacht oder?! [...] Habs auch schon mit ' probiert aber kein Erfolg =/ Backslash und einfaches Hochkomma wird nur verwendet, wenn es sich um eine ESC-Zeichenfolge handelt. Quasi Text == '\n'. Einzelne chars sind nichts weiter als Zahlen (-127 bis 128 || 0 bis 255 [byte]), folglich kannst du die einfach auf den Wert prüfen: char zeichen; //irgendwas if (zeichen == 13) //äquivalent zu zeichen == '\n' oder zeichen == 0x0D btw: Wenn du das aus Datei ließt oder schreibst, dann brauchst du bei Windows manchmal noch LF(0x0A) zusätzlich zum CR. Zitieren
DeMon Toll Geschrieben 11. August 2008 Autor Geschrieben 11. August 2008 (bearbeitet) Moin, erst mal danke für eure Antworten . Hab mir nun was zusammen gebastelt nur jetzt hab ich ein anderes problem bzw. phänomen (zumindest für mich^^) will ich mal sagen. Und zwar: [B]Wbest << Produktname;[/B] [I]// Wbest ist der Filepointer auf Wbest.txt nur wird der Inhalt von Produktname (welcher ein string ist) nicht in die Datei Wbest.txt geschrieben. Wie gesagt für mich ist es ein phänomen vlt. weis einer die Antwort darauf denn eigentlich soll es genau das machen den Inhalt in die Datei schreiben oder?! Die Datei Wbest.txt wurde mit fstream Wbest (Wbest.txt); geöffnet also zum lesen und zu schreiben. so long DeMon Bearbeitet 11. August 2008 von DeMon Toll Zitieren
Hexagon Geschrieben 11. August 2008 Geschrieben 11. August 2008 Moin. fstream Wbest (Wbest.txt); geöffnet also zum lesen und zu schreiben. Wieso? Brauchst du beides? Und iostream wäre dann glaub ich besser geeignet. Wenn die Datei 'Wbest.txt' nur als Ausgabe dient, dann nimm ofstream und vor dem schließen der Datei noch ein 'flush()'. Zitieren
DeMon Toll Geschrieben 11. August 2008 Autor Geschrieben 11. August 2008 Ich brauche beide methoden da in einem vorigen schritt der Inhalt in der Console ausgegeben wird. Das mit dem flush(); ist ein guter Tipp danke so long DeMon Zitieren
Guybrush Threepwood Geschrieben 11. August 2008 Geschrieben 11. August 2008 Ohne flush hätte es aber spätestens wenn du die Datei schließt bzw. dein Programm beendest darin stehen müssen... Zitieren
DeMon Toll Geschrieben 11. August 2008 Autor Geschrieben 11. August 2008 Das dachte ich auch^^, dem war aber nicht so =/. Und ich bin bis jetzt noch nicht drauf gekommen wieso^^. so long DeMon Zitieren
Guybrush Threepwood Geschrieben 11. August 2008 Geschrieben 11. August 2008 Zeig mal das komplette Programm wenn es nicht zu lang ist. Zitieren
DeMon Toll Geschrieben 11. August 2008 Autor Geschrieben 11. August 2008 Es ist schon relativ lang;) für meine verhältnisse auf jedenfall^^. Er ist auf jeden fall zu lang für einen Post^^. Ich müsste (laut meldung) 10k zeichen kürzen. Ich kann ja wenn gewollt es in teilen posten^^. Oder ich schicks dir als pn. so long DeMon Zitieren
Guybrush Threepwood Geschrieben 11. August 2008 Geschrieben 11. August 2008 Nee das ist mir zu lang, mehr wie 20 Zeilen les ich nicht Aber es tritt nicht noch irgendein anderer Fehler auf wenn du dein Programm beendest oder so? Zitieren
DeMon Toll Geschrieben 11. August 2008 Autor Geschrieben 11. August 2008 Nein es läuft alles einwandfrei bis auf das schreiben. Er meckert nicht er wirft keine Fehler aus es stürtzt nichts ab er schreibt einfach nur nicht^^. Hier mal der Komplette Switch case block bis zu Relevanten Stelle: short int change_yn; eingabegoto: string Produktmenge; string Produktname; cout << "\n\n\nModule zur Warenzufuhr"<< endl; cout << "___________________________"<<endl; cout << "Name des Prdoukts:\t"; cin >> Produktname; cout << "\n\nMenge des Produkts:\t"; cin >> Produktmenge; bestaetigungsgoto: cout << "\n\nUeberpruefen Sie Bitte die Eingaben"<<endl; cout << "\n\n\n\t====================" << endl; cout << "\t Name: " << Produktname <<endl; cout << "\t Name: " << Produktmenge <<endl; cout << "\t====================" << endl; cout << "\n\nDiese Informationen uebernehmen und schreiben?!"<<endl; cout << "[1] Ja Informationen Schreiben"<<endl; cout << "[2] Nein Informationen nicht Schreiben und zur Eingabe zurueck kehren"<<endl; cout << "<INPUT>:"; cin >> change_yn; switch (change_yn){ //bestätigungsanfrage case 1: //Eingabe bestätigung cout << "OK Aenderungen werden Uebernommen"<<endl; Wbest << Produktname; Wbest << "\t"; Wbest << Produktmenge; cout << "Schreiben der Daten erfolgreich"<<endl; cout << "Status: OK"<< endl; //flush(); Wbest.close(); break; so long DeMon Zitieren
Hexagon Geschrieben 11. August 2008 Geschrieben 11. August 2008 Öhm... DeMon... Wbest.flush(); BTW: Goto ist kein guter Stil! :mod: Zitieren
Klotzkopp Geschrieben 11. August 2008 Geschrieben 11. August 2008 Wbest.flush(); Close macht automatisch ein flush, das sollte keinen Unterschied machen. Welchen Typ hat change_yn? Wurde die Datei überhaupt erfolgreich geöffnet? Zitieren
DeMon Toll Geschrieben 11. August 2008 Autor Geschrieben 11. August 2008 Moin, change_yn ist ein short int da ja im grunde nur 2 wahlmöglichkeiten bestehen. Wbest.txt wird richtig geöffnet (zumindest was das lesen angeht) ich kann den inhalt auslesen und auf dem Bildschirm ausgeben. Wie gesagt ich bin echt ein bissl ratlos^^. Achja falls es hilft ich verwende DevCPP in der Version 4.9 so long DeMon Zitieren
Klotzkopp Geschrieben 12. August 2008 Geschrieben 12. August 2008 Wbest.txt wird richtig geöffnet (zumindest was das lesen angeht) ich kann den inhalt auslesen und auf dem Bildschirm ausgeben.Öffnest du etwa dasselbe fstream-Objekt mehrfach? Das ist keine gute Idee. Soweit man das aus dem kurzen Codeabschnitt erkennen kann, sieht dein Code ziemlich unstrukturiert aus. Du solltest etwas weniger Wert auf schick formatierte Ausgaben, und dafür mehr auf eine bessere Strukturierung des Codes legen. Die Gotos müssen raus, dafür muss eine ordentliche Fehlerbehandlung rein. Du siehst ja, dass deine Ausgabe "Schreiben der Daten erfolgreich" gar nicht stimmt. In einem riesigen, unstrukturierten Codehaufen ist es nunmal sehr schwierig, einen Fehler zu finden. Zitieren
DeMon Toll Geschrieben 12. August 2008 Autor Geschrieben 12. August 2008 (bearbeitet) Nein es wird nur 1 mal per fstream zum lesen und schreiben geöffnet dann wird per while schleife der inhalt ausgegeben (das funktioniert), nach ein paar verzweigungen kommen wir zum schreiben (Wbest.txt wird nicht geschlossen) und das funktioniert nicht das schreiben. Hier mal etwas mehr QT^^. if (menuewahl == 1){ // Kompletter Warenbestand anzeigen MenueWahlgoto: short int Dialogwahl; system ("cls"); fstream Wbest("Wbest.txt"); //Die Datei Wbest.txt zum lesen und schreiben öffnen string line; while (getline(Wbest, line)){ //zeilenweises einlesen der Datei cout << line << endl; output_counter = output_counter+1; //je zeilendurchlauf den couter um 1 erhöhen } cout << "_______________________________"<<endl; //Mögliche Interaktionsmöglichkeiten cout << "[1] - Dialog erneuern" <<endl; cout << "[2] - Ware hinzufuegen" << endl; cout << "[3] - Ware loeschen" << endl; cout << "[4] - Zum Hauptmenue" << endl; cout << "<INPUT>:"; cin >> Dialogwahl; if (Dialogwahl == 1){ goto MenueWahlgoto; } if (Dialogwahl == 2){ short int change_yn; eingabegoto: string Produktmenge; string Produktname; cout << "\n\n\nModule zur Warenzufuhr"<< endl; cout << "___________________________"<<endl; cout << "Name des Prdoukts:\t"; cin >> Produktname; cout << "\n\nMenge des Produkts:\t"; cin >> Produktmenge; bestaetigungsgoto: cout << "\n\nUeberpruefen Sie Bitte die Eingaben"<<endl; cout << "\n\n\n\t====================" << endl; cout << "\t Name: " << Produktname <<endl; cout << "\t Name: " << Produktmenge <<endl; cout << "\t====================" << endl; cout << "\n\nDiese Informationen uebernehmen und schreiben?!"<<endl; cout << "[1] Ja Informationen Schreiben"<<endl; cout << "[2] Nein Informationen nicht Schreiben und zur Eingabe zurueck kehren"<<endl; cout << "<INPUT>:"; cin >> change_yn; switch (change_yn){ //bestätigungsanfrage case 1: //Eingabe bestätigung cout << "OK Aenderungen werden Uebernommen"<<endl; Wbest << Produktname; Wbest << "\t"; Wbest << Produktmenge; cout << "Schreiben der Daten erfolgreich"<<endl; cout << "Status: OK"<< endl; Wbest.close(); break; Und ja die goto's sind alles andere als sauber ich weis aber meiner meinung nach die einzige möglichkeit in einem Programm an bestimmte stellen zu springen oder gibts da noch etwas anderes?! so long DeMon Edit: Das mit der Fehlerbehandlung stimmt ich hab da auch schon eine idee wie ich das anstelle (zeilenweises einlesen und anschließend mit der eingabe vergleichen), aber momentan geht es ja um das Schreiben der Daten und das klappt irgendwie nicht^^. Bearbeitet 12. August 2008 von DeMon Toll Zitieren
Guybrush Threepwood Geschrieben 12. August 2008 Geschrieben 12. August 2008 oder gibts da noch etwas anderes?! Ja eine vernünftige Programmstruktur Zitieren
TDM Geschrieben 12. August 2008 Geschrieben 12. August 2008 Ja eine vernünftige Programmstruktur [hust]Funktionen[/hust] (Dann lässts sich auch besser debuggen.) :floet: Zitieren
DeMon Toll Geschrieben 12. August 2008 Autor Geschrieben 12. August 2008 Stimmt Funktionen :upps, ich werd jetzt anfangen in Funktionen zu packen^^. so long DeMon Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.