Notizkalendar programmieren. -> Denkanstoß :)



  • 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 oO 😃

    Okay 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 xD 😃

    Wie 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 einfach return 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.
    Statt

    else
        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.



  • Okay werde ich mal eben ausprobieren, danke 🙂

    Und hab grade mal
    system("cls");
    ausprobiert. Das funktioniert. Das Programm wird "geleert" und fängt wieder von vorne an...bloß stoppt es nicht und man kann die eingegeben notiz nicht mehr lesen obwohl ich ein break; eingefügt habe

    Edit: Eeeeedel der sagt mir den Fehler ja direkt im Programm 🙂 Nice 🙂
    Also da steht "no such file or directory" - wie ich verstehe soll das wohl andeuten dass der keine files zum löschen findet?



  • correctamundo!

    Blöd gesagt: Wo auch immer Dein Programm hat Löschen lassen wollen, was unter dem Namen nichts zu finden. Mag daran liegen, dass die Dateien schlicht und einfach nicht existieren oder dass sie möglicherweise nicht im Aufrufpfad (= Suchpfad für Öffnen, Löschen, Wasauchimmer) liegen.

    break;
    

    ist keine Funktion zum Anhalten des Programms. Funktionen erkennst Du grundsätzlich daran, dass die Klammern folgen und falls gewünscht auch Parameter drin stehen.
    Solltest Du anders vorgehen... Mal wieder völlig ohne Gewähr und ungetestet:

    printf ("\n--Eingabetaste zum Fortfahren--\n");
    while ('\n' != getchar());
    

    Bis Du "irgendeineEingabeoderauchnichtsweiter" gefolgt von Enter drückst, tut sich dann nichts und Du kannst in Ruhe lesen, was passiert + dein Eingabepuffer ist keine Herberge für heimatlose NewLines.

    break;
    

    dagegen ist eine Anweisung, die das Verlassen einer switch-Direktive oder einer Schleife auslöst.



  • Die Dateien exisiterien aber 😞
    Und sie heißen auch exakt so wie ich sie beschrieben habe.

    Und mit deinem Codeschnipsle für die Pausierung will auch nicht funktionieren..

    // 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 f\x81r %s\n", Tag);
    		 while (fgets(zeile, 79, fp)) printf("%s", zeile);
          fclose(fp);
    	  printf ("\n--Eingabetaste zum Fortfahren--\n");
    		while ('\n' != getchar()); 
    	  system("cls");
    	  return 0;
    
        }
    

    Edit: Ahhh ich habs! 😃 mit _getch(); funktioniert es ohne Probleme 🙂

    Jetzt nur doch dieses doofe Löschen der Notizen und dann hät ichs ja sozusagen 😃



  • Wenn das der Professor liest, der Donnerstags im Raum H01.01 in FB seine Vorlesung liest 😃



  • Waaaaaaaaaaaaaaas 😃
    Ist doch wahr 😃

    FB? Edit: Achso FriedBerg 😉
    Edit2: Ach "Kampi" = Kampschulte? 😃



  • 1. Immer noch besser, als NICHTS zu tun und zu sagen "kapier ich halt ned"...
    2. Professoren halten Vorlesungen in FaceBook?

    Buster: Mach doch mal die Probe aufs Exempel und codiere den exakten und absoluten Pfad zu so einer Datei ganz oben ins main vor anderen Funktionen.

    if (remove ("c:\Hierliegt\meineDatei.txt")) fprintf (stderr, "Fehler: %s\n", strerror(errno));
    return (0);
    

    Dann schau nach ob die vorher existierende Datei weg ist und was in puncto Fehlermeldung ausgegeben wird.


Anmelden zum Antworten