generelle Anfängerfragen bzgl. Datenströmen / auslesen aus Dateien
-
Einen schönen guten Tag zusammen.
Dies ist mein erster Post hier in dem Forum, ich bin mir nicht ganz sicher ob dies auch das richtige Unterforum ist. Desweiteren habe ich natürlich schon die Suchfunktion sowie Google benutzt, allerdings weiß ich nicht genau wonach ich suchen muss, hätte ich irgendetwas gefunden, was mir weiterhelfen könnte, so hätte ich erstmal damit herumprobiert, anstatt diesen Beitrag zu eröffnen.
Ich möchte auch nicht, dass sich hier irgendjemand die Mühe macht, um dieses kleine Programm für mich zu vervollständigen, wie unten schon erwähnt möchte ich lediglich ein paar Tips oder Anhaltspunkte haben, wie ich das Programm nach meinen Vorstellungen fertigstellen kann.
Vielen Dank schonmal dafür.Vielleicht kennt noch jemand das etwas ältere Spiel "Alien vs. Predator2".
Ich arbeite z.Z. an einem kleinen Programm, welches einem die Handhabung mit den *.rez
Dateien vereinfachen soll.
Theoretisch funktioniert mein Programm schon, allerdings wird es sicherlich viele Fehler haben und teilweise umständlich programmiert sein, da dies mein erstes wirkliches C++ Programm ist und ich hab mir alle Funktionen mehr oder weniger aus dem Internet zusammengesucht.
Mein Programm musste ich in 2 kleine Programme aufteilen, das erste ist dafür da eine Konfigurationsdatei zu erstellen, in Form eines *.ini Dokumentes.
Und das 2. Programm liest die Konfigurationsdatei aus, speichert den Inhalt in einer Variabel und fügt es als Parameter zu einem längeren Befehl hinzu, mit welchem dann letztendlich das Spiel gestartet werden soll.
Soweit funktioniert es. Allerdings ist diese Form nicht wirklich benutzerfreundlich, schöner wäre es lediglich ein Programm zu haben, welches den Benutzer beim ersten ausführen (oder wenn die config Datei leer ist) fragt, ob er eine neue erstellen möchte.
Wenn die Konfigurationsdatei angelegt wurde (wobei jeder mögliche Parameter eine Zeile darstellen soll) wäre es praktisch wenn der Benutzer beim abermaligen Start des Programmes, ein Auswahlmenü angeboten bekommt, welchen Parameter, sprich welche Zeile er mit dem Spiel laden möchte, oder ob er das Spiel ohne weitereParameter starten möchte.
Ich glaube das hört sich alles viel komplizierter an, als es eigentlich ist.
Leider weiß ich viele Sachen nicht, wie z.B. lese ich einzelne Zeilen aus einer Textdatei, oder wie erstelle ich ein funktionierendes Auswahlmenü mit case / switch Anweisungen.Hier mal der Code meiner beiden Programme, ich bin für jeden Tip dankbar.
Vielen Dank schonmal und schönen Gruß:
Max#include <windows.h> #include <iostream> #include <fstream> #include <sstream> #include <string> #include <conio.h> using namespace std; int main (int argc, char *argv[]) { FILE* config; config = fopen("config.ini", "a"); fclose(config); char inc[55]; cout<<"Konfigurationseditor -\n\n"; cout << "Bitte kompletten *.rez Namen angeben der automatisch"; cout << " mit geladen werden soll \nz.B. \"-rez avp2league.rez -rez test.rez\"\n"; cout << "oder \"-rez maps -rez custom/test.rez.\"\nENTER um das Programm zu beenden.\n\nDeine Eingabe: "; cin.get (inc, 54); fstream f; f.open("config.ini", ios::out); f << inc << endl; f.close(); return 0; }
#include <windows.h> #include <iostream> #include <fstream> #include <sstream> #include <string> #include <conio.h> using namespace std; int main (int argc, char *argv[]) { FILE* config; config = fopen("config.ini", "a"); fclose(config); std::fstream FStream; FStream.open ("config.ini", std::ios::in); /* Überflüssige Fehlerroutine? if (!FStream) { cout << "Config Datei nicht gefunden...\nDruecke Taste um das Programm zu beenden." << ends; getch(); exit(2); } */ { FStream.seekg(0, std::ios::end); unsigned long FileSize = std::streamoff(FStream.tellg()); FStream.seekg(0, std::ios::beg); char *Buffer = new char [FileSize+1]; // Ganze Zeile in das char-Array FStream.getline(Buffer,FileSize); // Wenn Zeile leer ist ... if (FileSize == 0) { // menu cout<<"- Loader -\n\n"; cout<<"Es wurde keine Konfiguration gefunden... \n"; cout<<"bitte Configurator starten.\n\n"; cout<<"Programm verlassen: "; getch(); exit(2); } Buffer [FileSize] = '\0'; FStream.close () ostringstream os; os << "lithtech.exe" << " -windowtitle \"avpII\" -rez AVP2 -rez AVP2.REZ " << " " << Buffer << " +DisableMusic 0"; // Programm mit Parametern starten system( os.str().c_str() ); /* Gesamten string ausgeben cout << os.str().c_str(); */ delete [] Buffer; } return 0; }
-
Irgendwie wird mir dein Problem nicht ganz klar, aber einige Ansätze:
Zeile aus Datei machst du doch schon (genau das ist die Aufgabe von getline).
while(f.getline(buffer)!=EOF) process(buffer);
(bei der Abbruchbedingung bin ich mir nicht ganz sicher, aber in der Dokumentation von getline() sollte drinstehen, was er bei EOF zurückgibt)
switch-case:
cout << "[1] Befehl 1" << endl; //... int sel; cin >> sel; switch(sel) { case 1: do_command1(); break; case 2: do_command2(); break; //... default: cout<<"Falsches Kommando"<<endl; }
Soweit funktioniert es. Allerdings ist diese Form nicht wirklich benutzerfreundlich, schöner wäre es lediglich ein Programm zu haben, welches den Benutzer beim ersten ausführen (oder wenn die config Datei leer ist) fragt, ob er eine neue erstellen möchte.
Du hast doch im Ausführungsprogramm schon die Überprüfung, ob die Config-Datei vorhanden ist. Dort kannst du einfach statt der Fehlermeldung ("Config nicht gefunden") einen Aufruf einer Hilfsfunktion einbauen, das die Arbeit des Konfigurationsprogramms übernimmt.