Datei speichern/import
-
Hallo,
seit einiger Zeit sitze ich nun schon an einer Konsolenanwendung, welche ich mit C programmiere. Nun komme ich nicht weiter. Meine Frage:Das Programm soll den Benutzer eine art Multiple-Choice Test abfragen. Der Benutzer soll die möglichkeit haben diesen Test mit dem Programm selbst zu erstellen. Er wird nach anzahl der Fragen, den Fragen, 3 Antwortmöglichkeiten und nach der Nummer der richtigen Antwort/en gefragt. Nun möchte ich das die gesammelten Daten in einer Datei abgespeichert werden. Das Programm sollte allerdings in der lage sein, diese Daten später wieder auszulesen.
Ich habe mir das etwa so vorgestellt:
FILE* file; char* dateiname; dateiname=(char*) malloc(256*sizeof(char)); printf("Unter welchem Dateinamen soll ihre Datei abgespeichert werden?\n"); scanf("%s",dateiname); file=fopen(dateiname,"w"); fprintf(file,/*Fragen, Antworten und richtige Antworten in brauchbarer Form abspeichern*/);
Hat vielleicht jemand eine sinnvolle Idee, wie ich die Datei abspeichern bzw. importien sollte? Schon mal vielen Dank
-
zum dateinamen speichern brauchst du schonmal kein malloc zu benutzen. nimm einfach FILENAME_MAX, deklariert in stdio.h
char datei[FILENAME_MAX+1]; scanf( "%sFILENAME_MAX", datei );
Der Benutzer soll die möglichkeit haben diesen Test mit dem Programm selbst zu erstellen. Er wird nach anzahl der Fragen, den Fragen, 3 Antwortmöglichkeiten und nach der Nummer der richtigen Antwort/en gefragt. Nun möchte ich das die gesammelten Daten in einer Datei abgespeichert werden. Das Programm sollte allerdings in der lage sein, diese Daten später wieder auszulesen.
müsstest dir überlegen, wann die eingabe eines satzes oder einer frage als beendet angesehen wird. der benutzer wird vermutlich zeilenumbrüche mit der enter-taste einfügen wollen. die eingegebene frage würde dann in mehreren teilen eingelesen werden müssen, usw.
zum abspeichern eines satzes bzw. einer frage könntest du ein nicht druckbares steuerzeichen benutzen, etc.das könnte eine starthilfe sein:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LINELEN_MAX 81 int anhaengen( char* zeile, char* anhang ) { // ... return 0; } int speichern( char* zeile, char* dateiname ) { //... return 0; } int main() { char datei[FILENAME_MAX+1]={0}; char zeile[LINELEN_MAX]={0}; // zum einlesen char* pzeile=NULL; // zum speichern char* esc = NULL; char* lf = NULL; char* enter = NULL; puts("Dateiname ?"); scanf("%FILENAME_MAXs", datei ); puts("Frage eingeben, beenden mit Escape und Enter."); while(1) { fgets(zeile, LINELEN_MAX, stdin ) ); if ( lf = strchr(zeile, 10 ) ) *lf = '\0'; // fgets fügt zeilenumbrüche ein, die werden entfernt if ( enter = strchr(zeile, 13 ) ) *enter = '\n'; // enter soll ein zeilenumbruch sein if ( esc = strchr(zeile, '^' ) ) {// eingabe eines satzes, einer frage wird mit escape beendet, escape durch zeilenumbruch ersetzen *esc = '\n'; if (anhaengen(pzeile, zeile)) return 1; // letze eingabe vor dem escape speichern break; } if (anhaengen(pzeile, zeile)) return 1; //printf("%s %d\n", zeile, strlen(zeile)); } //printf("%s %d\n", zeile, strlen(zeile));// letzte eingabe vor dem escape if ( speichern(pzeile, datei )) return 1; return 0; }
-
Vielen Dank, hat mir schon ziemlich weitergeholfen, allerdings ist mir noch unklar, wie ich die Fragen, Antwortmögl. und richtigen antworten in einer datei speicher, welche dann sinnvoll wieder ausgelesen werden kann (um den benutzer z.b genau die fragen abzufragen).
-
du kannst ein zeichen bestimmen, welches das ende einer frage/antwort etc. kennzeichnet. das speicherst du mit ab.
damit kannst du beim einlesen deine fragen/antworten zählen.
-
Alles klar, danke für die Hilfe
-
und wenn der benutzer das zeichen eingibt ?
-
frager schrieb:
und wenn der benutzer das zeichen eingibt ?
man nehme ein zeichen, das der benutzer nicht eingeben kann, z.b. \v
oder sooo.
guckst du hier:#include <math.h> #include <stdio.h> #include <windows.h> void wake_him_up() { int i; puts("Ding Dong !"); for ( i=0; i<3; i++ ) { putchar('\a'); Sleep(600); } exit(1); } int chk_input( int fragen, int antwort ) { if( antwort > fragen ) { printf("H%c%c%c%c%c%c%c%c?\n", 0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84); wake_him_up(); return 1; } return 0; } int get_question( char* file, char* buf) { int c=0; int anzahl=0, antwort=0, zeichen=0; FILE *fp = fopen(file, "r" ); //sprintf(format, "< Anzahl: %d Antwort: %d Zeichen: %d >\n", fragen, antwort, zeichen ); if ( NULL == fp ) return 1; while( !feof(fp) ) { c = getc(fp); if ( c == '<' ) break; } // * asterisk ignoriert die stringfelder fscanf(fp, "%*s %d %*s %d %*s %d", &anzahl, &antwort, &zeichen ); printf("%d %d %d\n", anzahl, antwort, zeichen ); while( !feof(fp) ) { c = getc(fp); if ( c == '>' ) break; } c = getc(fp); // zeilenumbruch verwerfen. fread(buf, zeichen, 1, fp ); fclose(fp); return 0; } int main() { char* file = "test.txt"; char format[256]={0}; char buf[256]={0}; int fragen=1, antwort=1; int zeichen; char* find = NULL, *next = NULL; char* frage="agga ugga for president?\n\v"; char* antwort1= "1) ja\n\v"; char* antwort2= "2) nein\n\v"; char* antwort3= "3) vielleicht\n\v"; FILE *fp = fopen(file, "w" ); if ( !fp ) return 1; zeichen=strlen(frage)+strlen(antwort1)+strlen(antwort2)+strlen(antwort3); /* puts("Anzahl Fragen, Antwort ?"); scanf("%d %d", &anzahl, &antwort); */ if(chk_input(fragen, antwort )) return 1; sprintf(format, "< Anzahl: %d Antwort: %d Zeichen: %d >\n", fragen, antwort, zeichen ); // puts(format); fputs(format, fp ); fputs(frage, fp ); fputs(antwort1, fp ); fputs(antwort2, fp ); fputs(antwort3, fp ); fclose(fp); if ( get_question(file, buf) ) return 1; puts(" :-) :-) :-) demo loop :-) :-) :-) "); find = buf; while( next = strchr(find, '\v') ) { *next = '\0'; printf("%s",find); find = next+1; } scanf("%d", &antwort ); if ( antwort != 1 ) { puts("Falsche Antwort !"); wake_him_up(); return 1; } else puts("Logisch !"); return 0; }