Notizkalendar programmieren. -> Denkanstoß :)
-
Ja das habe ich übersehen @ würmchen
@ DirkB
Ja, das ist mir auch aufgefallen xD
Was gibt es denn für Alternativen?Wie wäre es denn möglich das Lesen einer Datei in EINE Funktion zu packen?
Bzw. das Schreiben einer Datei.
Sprich 2 Funktionen?
Wäre das machbar bzw "klug"?Heißt das also, dass meine bisherige "Arbeit" fürn ***** war xD ?
Weil ich ja dachte mit dem switch case klappt das so alles...Und wie ist es möglich den Inhalt ALLER Dateien aufeinmal zu löschen? Überhaupt möglich?
-
Schau Dir doch mal n paar Codeschnipsel mit dem Stichwort call by reference an.
Du könntest es theoretisch auch in eine einzige Funktion packen und hättest ein Funktionsargument als "Schalter", ob geschrieben oder gelesen werden soll... Möglich ist viel
Und im Grunde ist am Anfang keine Arbeit vergebens. Hauptsache ist, dass man aus eigenen Fehlern lernt und sich weiterentwickelt.
-
So okay
Danke schonmal für den Hinweis.Also wenn cih nach call by reference google finde ich nur so Schnipsel wo Zeichen vertauscht werden. Also mit Zeigern * .
So aber jetzt versteh ich schonmal, dank "galileo computung openbook" wie das mit den Funktion abläuft
Denke so wird es auch übersichtlicher.
Nur halt noch die Frage wie ich das switch case umgehe..?
Also so hab ich das jetzt mal gemacht
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> void hauptmenue(void) { //Hauptmenü int wahl; printf("-----Notizkalendar------"); printf("\nMen\x81\n\n"); printf("========================\n\n"); printf("W\x84hlen Sie eine Option\n\n"); printf("Notiz/en abrufen\t1\n"); printf("Notiz/en einf\x81gen\t2\n"); printf("Notiz/en l\x94schen\t3\n"); printf("Programm beenden\t4\n\n"); printf("Ihre Wahl: "); scanf("%d", &wahl); } void untermenue(void) { //Untermenü Wochentag-Auswahl int tag; printf("\nUntermenue\n\n"); printf("=======================\n\n"); printf("Waehlen Sie einen Tag\n\n"); printf("Montag\t1\n"); printf("Dienstag\t2\n"); printf("Mittwoch\t3\n"); printf("Donnerstag\t4\n"); printf("Freitag\t5\n"); printf("Samstag\t6\n"); printf("Sonntag\t7\n"); printf("Ihre Wahl: "); scanf("%d", &tag); } int main(void) { hauptmenue(); untermenue(); _getch(); return 0; }
Edit: Ist es möglich aus
if ((fp = fopen("mo_notiz.txt","r+")) == NULL) { printf("\nDatei konnte nicht zum Lesen geoeffnet werden."); exit(1); } printf("Eingegebene Notiz/en fuer Montag\n"); while (fgets(zeile, 79, fp)) printf("%s", zeile); fclose(fp);
diesem Code einen einzelnen zu Machen der dann selbst den Pfad ändert zur Datei?
-
Du hast die Rückgabewerte vergessen.
Das switch-case sollst du nicht umgehen, sondern nur nicht soviel in die case reinschreiben.
Und das Anzeigen der Dateien und einlesen von neuen Notizen gehört auch in jeweils ein Funktion.
int Notizen_anzeigen(char *Dateiname, char *Tag) { if ((fp = fopen("Dateiname","r+")) == NULL) { printf("\nDatei %s fuer %s konnte nicht zum Lesen geoeffnet werden.", Dateiname, Tag); return 1; } printf("Eingegebene Notiz/en fuer %s\n", Tag); while (fgets(zeile, 79, fp)) printf("%s", zeile); fclose(fp); return 0; }
Und dann
case 1: Notizen_anzeigen("mo_notiz.txt", "Montag"); break; case 2: Notizen_anzeigen("di_notiz.txt", "Dienstag"); break; ....
-
Ohja das sieht doch wunderbar aus! Sowas meinte ich auch xD
Okay, danke=)
Aber warum sagt mir mein Compiler nun in Zeile 71-73
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> void hauptmenue(void); void untermenue(void); void notizlesen(void); void notizschreiben(void); FILE *fp; char zeile[80]; void hauptmenue(void) { //Hauptmenü int wahl; printf("-----Notizkalendar------"); printf("\nMen\x81\n\n"); printf("========================\n\n"); printf("W\x84hlen Sie eine Option\n\n"); printf("Notiz/en abrufen\t1\n"); printf("Notiz/en einf\x81gen\t2\n"); printf("Notiz/en l\x94schen\t3\n"); printf("Programm beenden\t4\n\n"); printf("Ihre Wahl: "); scanf("%d", &wahl); switch(wahl){ case 1: untermenue(); case 2: untermenue(); case 3: printf("Notiz/en werden gelöscht"); case 4: printf("Programm wird beendet"); } } void untermenue(void) { //Untermenü Wochentag-Auswahl int Notizen_anzeigen(char *Dateiname, char *Tag); int tag; printf("\nUntermenue\n\n"); printf("=======================\n\n"); printf("Waehlen Sie einen Tag\n\n"); printf("Montag\t1\n"); printf("Dienstag\t2\n"); printf("Mittwoch\t3\n"); printf("Donnerstag\t4\n"); printf("Freitag\t5\n"); printf("Samstag\t6\n"); printf("Sonntag\t7\n"); printf("Ihre Wahl: "); scanf("%d", &tag); switch(tag) { case 1: Notizen_anzeigen("mo_notiz.txt", "Montag"); break; case 2: Notizen_anzeigen("di_notiz.txt", "Dienstag"); break; case 3: Notizen_anzeigen("mo_notiz.txt", "Montag"); break; case 4: Notizen_anzeigen("di_notiz.txt", "Dienstag"); break; case 5: Notizen_anzeigen("mo_notiz.txt", "Montag"); break; case 6: Notizen_anzeigen("di_notiz.txt", "Dienstag"); break; default: printf("FEHLER! - Eingabe korrigieren!\n"); } } void notizlesen(void) { // Lesen int Notizen_anzeigen(char *Dateiname, char *Tag); { if ((fp = fopen("Dateiname","r+")) == NULL) { printf("\nDatei %s fuer %s konnte nicht zum Lesen geoeffnet werden.", Dateiname, Tag); return 1; } printf("Eingegebene Notiz/en fuer %s\n", Tag); while (fgets(zeile, 79, fp)) printf("%s", zeile); fclose(fp); return 0; } } void notizschreiben(void) { } int main(void) { hauptmenue(); _getch(); return 0; }
nicht definiert wär?
Und bei den returns stimmt der "Rückegabewert nicht mit dem Funtkionstyp überein" ...
Edit: Ok return hauptmenue(); ergibt keinen Fehler. D.h das nach Ausfürhung der Funktion das Programm wieder in die hauptmenue.Funktion springt, richtig?
-
Was soll denn Zeile 68 bzw 66 sein?
Lösche Zeile 66 und 79 und mach das ; aus Zeile 68 weg.
-
Holla die Waldfee...
Ja, ich dachte ich packe das in ne neue Funktion aber so funktioniert es fast.Jetzt sagt der mir aber im Programm, dass sie Notiz/en nicht geöffnet werden können. Hab auch schon die txt Dateien in den Grundornder geschoben - das hat auch nichts gebracht.
Edit: Und iwie erscheint jetzt ständig "DIe Notiz/en werden gelöscht" Woher kommt das?!
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> void hauptmenue(void); void untermenue_lesen(void); void untermenue_schreiben(void); FILE *fp; char zeile[80]; void hauptmenue(void) { //Hauptmenü int wahl; printf("-----Notizkalendar------"); printf("\nMen\x81\n\n"); printf("========================\n\n"); printf("W\x84hlen Sie eine Option\n\n"); printf("Notiz/en abrufen\t1\n"); printf("Notiz/en einf\x81gen\t2\n"); printf("Notiz/en l\x94schen\t3\n"); printf("Programm beenden\t4\n\n"); printf("Ihre Wahl: "); scanf("%d", &wahl); switch(wahl){ case 1: untermenue_lesen(); case 2: untermenue_schreiben(); case 3: printf("Notiz/en werden gelöscht"); case 4: printf("Programm wird beendet"); } } void untermenue_lesen(void) { //Untermenü Wochentag-Auswahl int Notizen_anzeigen(char *Dateiname, char *Tag); int tag; printf("\nUntermenue\n\n"); printf("=======================\n\n"); printf("Waehlen Sie einen Tag\n\n"); printf("Montag\t1\n"); printf("Dienstag\t2\n"); printf("Mittwoch\t3\n"); printf("Donnerstag\t4\n"); printf("Freitag\t5\n"); printf("Samstag\t6\n"); printf("Sonntag\t7\n"); printf("Ihre Wahl: "); scanf("%d", &tag); switch(tag) { case 1: Notizen_anzeigen("mo_notiz.txt", "Montag"); break; case 2: Notizen_anzeigen("di_notiz.txt", "Dienstag"); break; case 3: Notizen_anzeigen("mi_notiz.txt", "Montag"); break; case 4: Notizen_anzeigen("do_notiz.txt", "Dienstag"); break; case 5: Notizen_anzeigen("fr_notiz.txt", "Montag"); break; case 6: Notizen_anzeigen("sa_notiz.txt", "Dienstag"); break; case 7: Notizen_anzeigen("so_notiz.txt", "Dienstag"); break; default: printf("FEHLER! - Eingabe korrigieren!\n"); } } // Lesen int Notizen_anzeigen(char *Dateiname, char *Tag) { if ((fp = fopen("Dateiname","r+")) == NULL) { printf("\nDatei %s fuer %s konnte nicht zum Lesen geoeffnet werden.", Dateiname, Tag); return 1; } printf("Eingegebene Notiz/en fuer %s\n", Tag); while (fgets(zeile, 79, fp)) printf("%s", zeile); fclose(fp); return 0; } void untermenue_schreiben(void) { printf("test"); } int main(void) { hauptmenue(); _getch(); return 0; }
-
Die Variable Dateiname darf bei fopen nicht "" stehen. Sorry.
Und wegen "Dateien werden gelöscht":
DirkB schrieb:
Da fehlen die break;
-
Also wenn ich das so mache:
if ((fp = fopen("","r+")) == NULL) ....
liest das Programm auch nichts.
Und wenn ich ein break; nach fclose(fp) einfüge sagt mir der Compiler, dass diese Anweisung nur in einer Schleife oder Schalter verwendet werden darf.
....fclose(fp); break; }
-
Die "" müssen weg. Sonst wird versucht die Datei mit dem NAmen Dateiname uu öffne. Und die gibt ja nicht.
fopen(Dateiname, "r+"))
-
Und die break; gehören zu den case bei switch. Vor ein neues case, sonst läuft das Programm da durch.
-
Achsoooo
Ah ic hab als auf die case von notiz schreiben geschaut.
Dabei fehlte das break; bei den cases von menu oOOkay gut. das funktioniert schonmal alles. Hui
Also ich muss sagen ich hab jetzt in der Zeit mehr "gelernt" bzw verstanden als in den Vorlesungen xD
Ein Dank an das Forum
Aber noch eine letzte Frage für diesen Abend xDWie kann ich, nachdem eine Datei gelesen wurde, wieder zurück ins hauptmenue springen?
bei return hauptmenue();
...
fclose(fp);
return hauptmenue();
}sagt der Compiler: der rückgabewert stimmt nicht mit dem funktionstyp überein
-
Du kannst nur dahin springen, von wo du auch gekommen bist.
Also einfachreturn
und im hauptmenu musst du dann die Schleife machen.void hauptmenue(void) { //Hauptmenü int wahl; do { printf("-----Notizkalendar------"); ... printf("Ihre Wahl: "); scanf("%d", &wahl); switch(wahl){ case 1: untermenue_lesen(); case 2: untermenue_schreiben(); case 3: printf("Notiz/en werden gelöscht"); case 4: printf("Programm wird beendet"); } } while (wahl != 4) }
Nimm zum zurückgehen immer die selbe Taste z.B. 0
-
Okay, das funktioniert
Vielen Dank...vorerst xD
-
Nabend zusammen
Hab mal wieder 2 Fragen xD
1. Also ich hab nun eine Funktion eingebaut die alle NOtizdateien löschen soll - doch leider funktioniert es nicht..
void notiz_loeschen(void) { int remove(const char *Dateiname); char Dateiname[] = "mo_notiz.txt, di_notiz.txt, mi_notiz.txt, do_notiz.txt, do_notiz.txt, fr_notiz.txt, sa_notiz.txt, so_notiz.txt"; if (remove(Dateiname) == 0) printf("Notizen gel\x94scht!"); else printf("Notizen konnten nicht gel\x94scht werden."); getchar(); }
2. Ich weiß es gab einen Befehl, der das vorherige Ausgegebene im Programm sozusagen leert...bloß weiß ich nicht mehr wie das hieß?
Denn ist sieht doof aus, wenn die Konsole dann so voll geklatscht ist.
-
Alles was du zwischen den " stehen hast, ist der Dateiname.
Mit remove kannst du eine Datei löschen.#include <stdio.h> void notiz_loeschen(void) { // int remove(const char *Dateiname); nich selber deklarieren. Steht in stdio.h char *Dateiname[] = {"so_notiz.txt", "mo_notiz.txt", "di_notiz.txt, "mi_notiz.txt", "do_notiz.txt, "do_notiz.txt, "fr_notiz.txt, "sa_notiz.txt, NULL }; int i; for(i = 0; Dateiname[i] != NULL ; i++); { if (remove(Dateiname[i]) == 0) printf("Notizen gel\x94scht!"); else printf("Notizen konnten nicht gel\x94scht werden."); } getchar(); }
Zu 2. Das dürfte
clrscr()
aus der conio.h sein.
ist nicht im Standard (wie alles aus der conio.h)
-
Wenn ich
clrscr();
nach der Dateilesenfunktion eingebe sagt mir der Compiler "ist nicht definiert.Aber die
#include <conio.h>
habe ich ganz oben eingefügt.. mh?Und zu den Notizlöschen:
void notiz_loeschen(void) { int i; char *Dateiname[] = {"mo_notiz.txt", "di_notiz.txt", "mi_notiz.txt", "do_notiz.txt", "do_notiz.txt", "fr_notiz.txt", "sa_notiz.txt", NULL }; for(i = 0; Dateiname[i] != NULL ; i++); { if (remove(Dateiname[i]) == 0) printf("Notizen gel\x94scht!"); else printf("Notizen konnten nicht gel\x94scht werden."); } getchar(); }
So sollte das doch aussehen, richtig? Weil vorher hat er gesagt das i nicht deklariert ist.
Aber so funktioniert es auch nicht..Ich rufe diese Funktion ja im Menu auf indem ich notiz_loeschen(); break; bei dem case 3 hingeschrieben habe
-
Buster92 schrieb:
Aber so funktioniert es auch nicht..
Fehler beim compilieren?
Fehler im Programmablauf?
Wie kommst du darauf das es nicht funktioniert?
-
Ein Fehler erscheint nicht.
Der gibt mir aber im Programmablauf nur "Die Notizen konnten nicht gelöscht werden" aus...
-
Sei mal so frei und gib ganz oben bei Deinen includes noch
#include <errno.h>
mit an.
Stattelse printf("Notizen konnten nicht gel\x94scht werden.");
nimmst Du mal folgendes:
else { printf("Notizen konnten nicht gel\x94scht werden."); fprintf(stderr, "Fehler: %s\n", strerror(errno)); }
Mit etwas Glück bekommst Du womöglich noch ne Aussage zum System zu dem Fehler hingeschmissen.