Warum funktioniert diese Konsolenanwendung nicht?
-
Hallo @ all
Ich habe ein kleines Programm geschrieben, dass uns tiparbeit ersparen soll.
Hier der Code:
/* Demo 04. Erstellen von batch Dateien Main.cpp*/ #include <iostream> #include <fstream> #include <string> using namespace std; int main() { string dateiname; string n; ofstream dat_aus; int f,z,er; cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl; cout << "+Dieses Programm erstellt batch dateien mit ihren eingaben+" << endl; cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl << endl; cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl; cout << "++++Diese Programm befindet sich noch in der Beta Phase++++" << endl; cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl << endl; cout << "[Zeilenangabe]" << endl; cout << "->"; cin >> z; //Eingabe der Zeilenzahl (angefangen von 0) cout << "[Datei Inhalt]" << endl << endl; for(int i=1;i <= z;i++) // Schleife umzu testen ob int i gleich der Zeilenzahl ist, wenn nich i++. { cin >> n; // String Eingabe } cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl; cout << "+++++++Assistent zum Multiplieziren der Dateiinhalte+++++++" << endl; cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl << endl; cout << "[Multiplikationsfaktor]" << endl; cout << "->"; cin >> f; // Eingabe des Faktors mit dem die Zeilenzahl multipliziert wird. er = z * f; //Zeilenzahl mal Faktor cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl; cout << "++++++++++++++++Angaben fuer den Dateinamen++++++++++++++++" << endl; cout << "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl << endl; cout << "[Dateiname]" << endl; cout << "->"; cin >> dateiname + ".bat"; // Eingabe des Dateinamens dat_aus.open(dateiname.c_str(), ios_base::out); for(int d=1; d <= er;d++) //Schleife fuer das Speichern der Zeilen. { dat_aus << n << endl; } dat_aus.close(); return 0; }Das Problem liegt darin, dass wenn ich bei der Eingabe (n) zwei woerter schreibe , dass mir eine Fehlermeldung ausgegeben wird:
**
Debug Assertion Failed!Program:E:\Project Ablage\demo04\Debug\demo04.exe
File: fopen.c
Line: 54Expression: *file !=_T('\0')
or information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts
(Press Retry to debug the application)
**Kann jemand mir helfen, denn Code zu verbessern.
mfg pcfreak17
-
cin>>dateiname+".bat";Das ist Humbug - du liest in einen temporären String ein, der durch den op+ zusammengesetzt wurde. (erstaunlich, daß das durch den Compiler gekommen ist).
Besser geht es mit:cin>>dateiname; //einlesen des Namens dateiname+=".bat"; //".bat" anhängenAnsonsten noch ein paar inhaltliche Fehler:
for(int i=1;i <= z;i++) { cin >> n; }Du überschreibst in jedem Schleifendurchlauf die vorige Ausgabe - leg dir lieber einen vector<string> an, in den du nacheinander die Eingabezeilen packst.
Komplette Textzeilen liest man besser mit getline() ein als mit dem >> Operator (der hört nämlich am ersten Leerzeichen auf zu lesen).
-
Hallo CStoll
cin>>dateiname; //einlesen des Namens dateiname+=".bat"; //".bat" anhängenOkay, das sehe ich noch ein.
Leider stimmt dies
for(int i=1;i <= z;i++) { cin >> n; } Du überschreibst in jedem Schleifendurchlauf die vorige Ausgabenicht ganz.
Nachdem der User die Zeilenzahl angegeben hat, wird ueberpueft, ob die die momentane Zeilenzahl der angegebenen Zeilenzahl uebereinstimmt. Wenn dies nicht der fall ist, wird eine neue Zeile erstellt. Dies geschieht aber erst, wenn der User die Eingabetaste drueckt.
Somit wir gewaehrleistet, dass das Geschriebene nicht ueberschrieben wird.Leider steht in meinen Buch nicht ueber vector<string> und getline().
Kannst du mir da einwenig Code geben?mfg pcfreak17
-
Nachdem der User die Zeilenzahl angegeben hat, wird ueberpueft, ob die die momentane Zeilenzahl der angegebenen Zeilenzahl uebereinstimmt. Wenn dies nicht der fall ist, wird eine neue Zeile erstellt. Dies geschieht aber erst, wenn der User die Eingabetaste drueckt.
Wie gut kennst du dich mit den Grundlagen von C aus - speziell die Arbeitsweise der for()-Schleife?
for(int i=1;i<=z;i++) cin>>n;Diese Schleife beginnt damit, i auf 1 zu setzen (i=1), danach liest sie eine Eingabe von Tastatur ein (cin>>n), erhöht i um 1 (i++) und prüft, ob es den vorgegebenen Endwert erreicht hat (i<=z) - wenn ja, geht es dahinter weiter, andernfalls geht es zurück zu "cin>>n;".
Leider steht in meinen Buch nicht ueber vector<string> und getline().
Was hast du denn für ein Buch?
Kannst du mir da einwenig Code geben?
Ich kann's versuchen:
vector<string> Eingabe; string n;int z; cin>>z; Eingabe.reserve(z);//muß nicht sein, erleichtert aber die Arbeit for(int i=1;i<=z;++i) { getline(cin,n); Eingabe.push_back(n); } ... for(int i=0;i<Eingabe.size();++i) datei_aus<<Eingabe[i]<<endl;
-
Okay also
for(int i=1;i<=z;i++) cin>>n;Ich habe deshalb i auf 1 gesetzt weil er sonst, wenn ich bei der Zeilenzahl 1 eingebe und ich i auf 0 setzten wuerde, ich nicht eine Zeile eingeben muss sonder zwei. Weil er beginnt ja schon bei 0 zuzaehlen.
Mein Buch heißt:C++ Programmieren mit einfachen Beispielen.
(->leicht ->klar -> sofort)
Markt+Technik
DIRK LOUISWofuer ist dieser
Eingabe.reserve(z);Code da?
THX fuer den Code, werde ihn gleich mal testen.
mfg pcfreak17
-
pcfreak17 schrieb:
Ich habe deshalb i auf 1 gesetzt weil er sonst, wenn ich bei der Zeilenzahl 1 eingebe und ich i auf 0 setzten wuerde, ich nicht eine Zeile eingeben muss sonder zwei. Weil er beginnt ja schon bei 0 zuzaehlen.
Klar, mit z=1 wird die Schleife nur einmal durchlaufen und dann ist gut
Aber überleg dir mal, was z.B. bei der Eingabe z=5 passieren würde.Wofuer ist dieser
Eingabe.reserve(z);Code da?
Damit reserviert sich der Vektor genug Platz, um die benötigten Eingabezeilen aufnehmen zu können (andernfalls würde er seinen Speicherplatz stückweise vergrößern, wenn er beim push_back() an der aktuellen Kapazitätsgrenze ankommt). Das ist wie gesagt nicht unbedingt nötig, verbessert aber die Geschwindigkeit etwas (Speicher vergrößern und vorhandene Elemente umkopieren kostet Zeit).