Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdio.h>
- #include <string.h>
- #include <ctype.h>
- #include <stdlib.h>
- #include <time.h>
- #include <fstream>
- #include "fhswf_service.h"
- #define DATNAME "skrt.bin"
- #define EINGABELANGE 20
- #define MAXBYTES 40
- struct daten //Die guten Strukturen
- {
- char land[EINGABELANGE];
- char hstadt[EINGABELANGE];
- };
- // Funktionsprototypen
- FILE* datei_oeffnen(void);
- FILE* datei_oeffnen_aendern(void); // für Funktion aendern
- int get_dateigroesse(FILE*);
- void datei_lesen(struct daten*, FILE*);
- void datei_schreiben(struct daten*, FILE*);
- void datei_schreiben_ersetzen(struct daten*, FILE*);
- void daten_eingeben(struct daten*, FILE*, int);
- void dateiinhalt_aendern(struct daten*, int, FILE*);
- int RateSpiel(struct daten*);
- int checkInput_int(char*, int);
- //------------------------------main ---------------------
- int main(void)
- {
- // Variablendeklaration
- srand(time(NULL)); // RateSpiel
- int input, anzahl, distanz, rc, random, fehler;
- int wiederholen = 1;
- int already[EINGABELANGE] = { 0 };
- char eingabem[EINGABELANGE] = { 0 };
- FILE* my_datei;
- struct daten daten;
- // Programmwiederholung
- do
- {
- // Wiederholung bei falscher Eingabe
- do
- {
- system("CLS"); // Bildschirm löschen
- printf("Dies ist ein Programm um Laender und Hauptstaedte zu lernen.\n\n");
- printf("1 = Datei lesen\n");
- printf("2 = Land/Hauptstadt schreiben\n");
- printf("3 = Land/Hauptstadt aendern\n");
- printf("4 = Datei loeschen\n");
- printf("5 = Ratespiel\n");
- printf("0 = Programm verlassen\n");
- do
- {
- printf("\nIhre Auswahl: ");
- scanf("%s", eingabem);
- tastaturpuffer_leeren();
- fehler = checkInput_int(eingabem, strlen(eingabem)); // fehleingaben abfangen
- input = atoi(eingabem);
- if ((input < 0) || (input > 5)|| fehler > 0)
- {
- printf("Fehler in der Eingabe !\n");
- printf("Nur Werte zwischen 0 und 5 erlaubt!");
- //getchar();
- }
- } while (fehler > 0);
- // Wiederholung bei Falscheingabe
- } while ((input < 0) || (input > 5));
- switch (input)
- {
- case 1: // Dateiinhalt lesen
- system("CLS"); // Bildschirm löschen
- // Datei öffnen
- my_datei = datei_oeffnen();
- // wenn nicht erfolgreich Programm beenden
- if (!my_datei)
- {
- printf("Datei konnte nicht geoeffnet werden!\n\n");
- getchar();
- return(0);
- }
- // Anzahl der Dateieinträge bestimmen
- anzahl = get_dateigroesse(my_datei);
- if (anzahl == 0)
- {
- printf("Datei Leer!");
- fclose(my_datei);
- getchar();
- continue;
- }
- printf("#\tLand\t|\tHauptstadt\n"); // coole Ausgabe
- for (int index = 0; index < anzahl; index++)
- {
- datei_lesen(&daten, my_datei); // Inhalt lesen
- printf("%i\t%s\t|\t%s\n", index, daten.land, daten.hstadt);
- }
- fclose(my_datei); // Datei schließen
- getchar();
- break;
- case 2: // Daten in Datei schreiben
- // Bildschirm löschen
- system("CLS");
- // Kommentare wie case 1
- my_datei = datei_oeffnen();
- // wenn nicht erfolgreich Programm beenden
- if (!my_datei)
- {
- printf("Datei konnte nicht geoeffnet werden!\n\n");
- getchar();
- return(0);
- }
- // Dateiinhalt eingeben
- daten_eingeben(&daten, my_datei, 1);
- fclose(my_datei);
- getchar();
- break;
- case 3: // Dateiinhalt ändern
- system("CLS");
- // Kommentare wie case 1 und case 2
- my_datei = datei_oeffnen_aendern();
- // wenn nicht erfolgreich Programm beenden
- if (!my_datei)
- {
- printf("Datei konnte nicht geoeffnet werden!\n\n");
- getchar();
- return(0);
- }
- anzahl = get_dateigroesse(my_datei);
- if (anzahl == 0) // leere datei abfangen
- {
- printf("Datei Leer!");
- fclose(my_datei);
- getchar();
- continue;
- }
- printf("Es befinden sich %i Eintraege in der Datei\n", anzahl);
- printf("#\tLand\t|\tHauptstadt\n"); // wieder freshe usgabe
- for (int index = 0; index < anzahl; index++)
- {
- datei_lesen(&daten, my_datei); // Inhalt lesen
- printf("%i\t%s\t|\t%s\n", index, daten.land, daten.hstadt);
- }
- dateiinhalt_aendern(&daten, anzahl, my_datei); // dateien aendern
- fclose(my_datei);
- getchar();
- break;
- case 4:
- remove(DATNAME);
- printf("Datei wurde geloescht !\n"); // bye bye datei
- break;
- case 5:
- system("CLS");
- for (int index = 0; index < EINGABELANGE; index++) // reset der schon verwendeten zahlen
- already[index] = 0;
- rc = 0;
- // Kommentare wie case 1 und case 2
- my_datei = datei_oeffnen();
- if (!my_datei)
- {
- printf("Datei konnte nicht geoeffnet werden!\n\n");
- getchar();
- return(0);
- }
- anzahl = get_dateigroesse(my_datei);
- if (anzahl == 0) // rip wenn datei leer
- {
- printf("Datei Leer!");
- fclose(my_datei);
- getchar();
- continue;
- }
- rewind(my_datei);
- printf("Das Ratespiel!\n");
- for (int index = 0; index < anzahl; index++)
- {
- random = rand() % anzahl; // random zahlen
- if (already[random] != 0)
- {
- index--;
- continue; //wenn es die zahl schon gab
- }
- already[random] = 1; // flag setzen
- distanz = random * MAXBYTES;
- fseek(my_datei, distanz, SEEK_SET); // datei durchwandern
- printf("%i. von %i Paaren.\n", index+1, anzahl);
- datei_lesen(&daten, my_datei); // daten einlesen
- rc += RateSpiel(&daten); // eigentliches ratespiel
- }
- rc = (rc * 100)/ anzahl;
- printf("Sie hatten %i%% richtig!", rc); // Ausgabe in %
- getchar();
- break;
- case 0:
- wiederholen = 0; // Programm beenden
- break;
- }
- } while (wiederholen == 1);
- return (1);
- }
- //---------------------Ende main ------------------------------------------------------
- // ------------------Beschreibung der Funktionen -----------------------------------
- int RateSpiel(struct daten *daten)
- {
- char eingabe[EINGABELANGE] = { 0 }; // eingabefeld
- printf("\tDas Land: %s\n", daten->land); // Asugabe des Landes & eingabeaufforderung
- printf("\tDie Hauptstadt: ");
- gets_s(eingabe);
- if (!strcmp(daten->hstadt, eingabe)) // wenn gleich dann richtig
- {
- printf("Richtig!\n");
- getchar();
- return 1;
- }
- else
- {
- printf("Falsch, richtig waer %s!\n", daten->hstadt); // andernfalls fehler
- getchar();
- return 0;
- }
- }
- //-------------------Datei oeffnen zum Lesen und Schreiben -----------------------
- FILE* datei_oeffnen()
- {
- FILE* my_datei;
- my_datei = fopen(DATNAME, "ab+");
- // wenn nicht erfolgreich --> Fehler zurückgeben und Programm beenden
- if (!my_datei)
- {
- return(NULL);
- }
- return(my_datei);
- }
- //-------------------Datei oeffnen zum Lesen und Schreiben -----------------------
- FILE* datei_oeffnen_aendern()
- {
- FILE* my_datei;
- my_datei = fopen(DATNAME, "rb+");
- // wenn nicht erfolgreich --> Fehler zurückgeben und Programm beenden
- if (!my_datei)
- {
- return(NULL);
- }
- return(my_datei);
- }
- //-------------------Dateigroesse bestimmen ----------------------
- int get_dateigroesse(FILE* my_datei)
- {
- int dummy = 0, anzahl = 0;
- //struct daten daten;
- // da beim Öffnen Dateipositionszeiger ggf. am Ende
- rewind(my_datei);
- // Datei lesen und Einträge zählen
- do
- {
- fread(&dummy, 1, 1, my_datei);
- anzahl++;
- } while (!feof(my_datei));
- dummy = 0;
- // da feof() erst nach Zugriff über Dateiende Wert ändert
- anzahl--;
- anzahl = anzahl / MAXBYTES;
- // Dateipositionszeiger wieder auf Anfang
- rewind(my_datei);
- return(anzahl);
- }
- //----------------------Daten aus Datei lesen -----------------------------
- void datei_lesen(struct daten *daten, FILE* my_datei)
- {
- int index, groesse;
- // Daten aus Datei lesen und in Feld schreiben
- fread(daten, MAXBYTES, 1, my_datei);
- }
- //-----------------------------Daten eingeben -------------------------------
- void daten_eingeben(struct daten *daten, FILE* my_datei, int fall)
- {
- char eingabel[EINGABELANGE] = {0};
- char eingabeh[EINGABELANGE] = {0};
- char ende[5] = { "ende" };
- int restart = 0;
- if (fall == 1)
- {
- printf("Die Eingabe wird mit \"ende\" (Case sensitive) beendet.");
- do
- {
- restart = 0;
- for (int index = 0; index < 20; index++) // reset
- {
- eingabel[index] = 0;
- eingabeh[index] = 0;
- }
- printf("\nLand/ende eingaben: "); // eingabe land
- gets_s(eingabel);
- if (!strcmp(eingabel, ende)) // terminieren bei ende
- continue;
- printf("Hauptstadt eigeben: "); //eingabe hauptstadt
- gets_s(eingabeh);
- if (eingabel[0] == 0 || eingabeh == 0) // wenn enter einfach gedrueckt wurde
- {
- printf("Fehleingabe!");
- restart = 1;
- }
- if (restart == 0) // wenn keine fhleingabe abspeichern
- {
- strcpy(daten->hstadt, eingabeh);
- strcpy(daten->land, eingabel);
- datei_schreiben(daten, my_datei);
- }
- } while (restart == 1 || strcmp(eingabel, ende));
- }
- else // einzeln aendern
- {
- do // kommentare wie oben
- {
- restart = 0;
- for (int index = 0; index < EINGABELANGE; index++)
- {
- eingabel[index] = 0;
- eingabeh[index] = 0;
- }
- printf("\nLand eingaben: ");
- gets_s(eingabel);
- printf("Hauptstadt eigeben: ");
- gets_s(eingabeh);
- if (eingabel[0] == 0 || eingabeh == 0)
- {
- printf("Fehleingabe!");
- restart = 1;
- }
- if (restart == 0)
- {
- strcpy(daten->hstadt, eingabeh);
- strcpy(daten->land, eingabel);
- //datei_schreiben(daten, my_datei);
- }
- } while (restart == 1);
- }
- }
- //------------------------Daten in Datei schreiben -------------------
- void datei_schreiben(struct daten *daten, FILE* my_datei)
- {
- // Dateipositionszeiger ans Ende
- fseek(my_datei, 0, SEEK_END);
- // Feldelemente in Datei schreiben
- fwrite(daten, sizeof(struct daten), 1, my_datei);
- }
- void datei_schreiben_ersetzen(struct daten *daten, FILE* my_datei)
- {
- fwrite(daten, sizeof(struct daten), 1, my_datei); // einzeln aendern
- }
- //-------------Dateiinhalt ändern--------------------------------
- void dateiinhalt_aendern(struct daten *daten, int anzahl, FILE* my_datei)
- {
- char eingabem[EINGABELANGE] = { 0 };
- int distanz, fehler;// Variable zum Navigieren in der Datei
- int nummer; // Variablen für neuen Wert
- char zeichen;
- //int durchlauf = 0;
- rewind(my_datei); // Dateipositionszeiger auf Anfang
- // Schleife für mehrere Änderungen
- do
- {
- // Schleife für Fehleingaben
- do
- {
- printf("\nWelcher Wert soll geaendert werden [0 bis %i] ", anzahl-1); // einzeln aendern
- scanf("%s", eingabem);
- tastaturpuffer_leeren();
- fehler = checkInput_int(eingabem, strlen(eingabem)); // fehleingaben abfangen
- nummer = atoi(eingabem);
- if ((nummer < 0) || (nummer > anzahl - 1) || fehler > 0)
- {
- printf("Fehler in der Eingabe !\n");
- printf("Nur Werte zwischen 0 und 5 erlaubt!");
- getchar();
- }
- } while ((nummer < 0) || (nummer > anzahl - 1 ) || fehler > 0);
- distanz = nummer * 40; // distanz setzen
- rewind(my_datei);
- fseek(my_datei, distanz, SEEK_SET); // zu distanz wandern
- daten_eingeben(daten, my_datei, 2);
- datei_schreiben_ersetzen(daten, my_datei);
- printf("\nNoch eine Aenderung ? J/N ");
- scanf("%c", &zeichen);
- tastaturpuffer_leeren();
- // wandeln in Großbuchstaben
- zeichen = toupper(zeichen);
- //durchlauf++;
- } while (zeichen == 'J');
- }
- int checkInput_int(char* eingabe, int laenge)
- {
- int fehler = 0;
- int rc = 0; // return_code
- int index; // Schleifenindex
- // führendes + Zeichen eliminieren
- if (eingabe[0] == '+')
- {
- laenge = laenge - 1;
- index = 0;
- while (eingabe[index] != 0)
- {
- eingabe[index] = eingabe[index + 1];
- index++;
- }
- eingabe[index] = 0; //Stringendezeichen setzen
- }
- // übergebenen String zeichenweise auswerten
- for (index = 0; index < laenge; index++)
- {
- rc = isdigit(eingabe[index]); // Prüfung auf Ziffer 0 bis 9
- // Rückgabewert auswerten
- if (rc == 0)
- {
- fehler++; // Fehlervariable erhöhen
- }
- }
- // Prüfung auf Vorzeichen
- if (eingabe[0] == '-')
- {
- fehler++;
- }
- //Rückgabe an aufrufende Funktion
- return (fehler);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement