Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <string.h>
- typedef struct Foto
- {
- char szdateiname[100];
- char szort[100];
- char szkurzbeschreibung[100];
- char szdatum[11];
- struct Foto* pnaechstes_foto;
- struct Foto* pvorheriges_foto;
- } Foto;
- //Prototypen
- //////////////////
- Foto* AlbumAnlegen(char* szdateiname); // charakter
- Foto* AlbumLaden(char* szdateiname);
- Foto* AlbumDurchsuchen(Foto* pliste);
- Foto* FotoEntfernen(Foto* pfoto);
- Foto* FotoHinzufuegen(Foto* pliste);
- void AlbumSpeichern(char* szdateiname, Foto* pliste);
- void AlbumAnzeigen(Foto* pliste);
- void FotoDetailsEinlesen(Foto* pfoto);
- void FotoDetailsAnzeigen(Foto* pliste);
- void FotoAnzeigen(char* szdateiname);
- //////////////////
- int main()
- {
- char szdateiname[100] = { 0 };// 100 ist die zeichen von mein datei
- Foto* pliste = 0;
- int iwahl = 0;
- int ineuzeichnen = 0; //Soll das Fenster im aktuellen durchlauf der schleife neu gezeichnet werden?
- do
- {
- if(ineuzeichnen)
- {
- fflush(stdin);// mein löscchte eingabe puffer
- _getch(); // mein programm wartet bis zu einer taster gedrückt
- system("cls");
- ineuzeichnen = 0;
- }
- if(szdateiname[0])
- {
- printf("Aktuelle Verwaltungsdatei: %s.bin\n", szdateiname);
- }
- else
- {
- puts("Willkommen im Fotoverwaltungsprogramm!\nEs ist gerade keine Verwaltungsdatei geoeffnet!");
- }
- puts("Bitte eine Aktion auswaehlen\n\n"
- "[n] Neues Album anlegen\n"
- "[l] Album laden\n\n"
- "[h] Foto zum Album hinzufuegen\n"
- "[b] Album betrachten\n"
- "[a] Album abspeichern\n"
- "[s] Album speichern und schliessen\n\n"
- "[x] Programm beenden");
- fflush(stdin);
- iwahl = _getch();
- system("cls");
- switch(iwahl)
- {
- case 'n':
- if(pliste)
- {
- puts("Es ist bereits ein Album geoeffnet!");
- ineuzeichnen = 1;
- }
- else
- {
- pliste = AlbumAnlegen(szdateiname);
- if (pliste)
- {
- puts("Neues Album erfolgreich angelegt");
- }
- else
- {
- puts("Fehler beim anlegen eines neuen Albums");
- memset(szdateiname, 0, sizeof(szdateiname)); //dateinamen zurücksetzen. mein datei auf 0 setzen
- ineuzeichnen = 1;
- }
- }
- break;
- case 'l':
- if (pliste)
- {
- puts("Es ist bereits ein Album geoeffnet!");
- ineuzeichnen = 1;
- }
- else
- {
- pliste = AlbumLaden(szdateiname);
- if(pliste)
- {
- puts("Album erfolgreich geladen");
- ineuzeichnen = 1;
- }
- else
- {
- puts("Fehler beim laden des Albums");
- memset(szdateiname, 0, sizeof(szdateiname)); //dateinamen zurücksetzen
- ineuzeichnen = 1;
- }
- }
- break;
- case 'h':
- if (pliste)
- {
- pliste = FotoHinzufuegen(pliste);
- ineuzeichnen = 1;
- }
- else
- {
- puts("Fehler es ist kein Album geoeffnet!");
- ineuzeichnen = 1;
- }
- break;
- case 'b':
- if(pliste)
- {
- AlbumAnzeigen(pliste);
- }
- else
- {
- puts("Fehler es ist kein Album geoeffnet!");
- ineuzeichnen = 1;
- }
- break;
- case 'a':
- if(pliste)
- {
- AlbumSpeichern(szdateiname, pliste);
- puts("Album gespeichert");
- ineuzeichnen = 1;
- }
- else
- {
- puts("Fehler es ist kein Album geoeffnet!");
- ineuzeichnen = 1;
- }
- break;
- case 's':
- {
- if(pliste)
- {
- AlbumSpeichern(szdateiname, pliste);
- puts("Album gespeichert");
- //Zu erstem foto springen
- while (pliste->pvorheriges_foto)
- {
- pliste = pliste->pvorheriges_foto;
- }
- //speicher freigeben
- while (pliste->pnaechstes_foto)
- {
- pliste = pliste->pnaechstes_foto;
- free(pliste->pvorheriges_foto);
- }
- //kopf freigeben
- free(pliste); //myliste ist frei
- pliste = 0;
- puts("Schliessen des Albums erfolgreich");
- memset(szdateiname, 0, sizeof(szdateiname)); //Dateinamen zurücksetzen ich setze datei name auf 0
- ineuzeichnen = 1;
- }
- else
- {
- puts("Es ist kein Album zum schliessen vorhanden!");
- }
- }
- break;
- default: // wenn kein zu getroffen hat
- puts("Falsche Eingabe\n\n");
- ineuzeichnen = 1;
- break;
- case 'x':
- break;
- }
- }
- while(iwahl != 'x');
- return 0;
- }
- Foto* AlbumAnlegen(char* szdateiname)
- {
- Foto* plistenkopf = calloc(1, sizeof(Foto));
- //printf("Speicher wurde an folgender Adresse allokiert: %p\n", plistenkopf);
- if (plistenkopf)
- {
- plistenkopf->pvorheriges_foto = 0;
- plistenkopf->pnaechstes_foto = 0;
- puts("Bitte Namen des Albums eingeben");
- fflush(stdin);
- gets(szdateiname);
- puts("Bitte Daten fuer das erste Foto eingeben");
- FotoDetailsEinlesen(plistenkopf);
- }
- else
- {
- puts("Fehler beim allokieren von Speicher!");
- }
- return plistenkopf;
- }
- void FotoDetailsEinlesen(Foto* pfoto)
- {
- if(pfoto)
- {
- puts("Bitte Namen des Fotos eingeben (ohne .jpg)");
- fflush(stdin);
- gets(pfoto->szdateiname);
- puts("Bitte Datum des Fotos im Format TT.MM.JJJJ eingeben");
- fflush(stdin);
- gets(pfoto->szdatum);
- puts("Bitte Aufnahmeort des Fotos eingeben");
- fflush(stdin);
- gets(pfoto->szort);
- puts("Bitte Kurzbeschreibung des Fotos eingeben");
- fflush(stdin);
- gets(pfoto->szkurzbeschreibung);
- system("cls");
- }
- }
- Foto* AlbumLaden(char* szdateiname)
- {
- Foto* pletztes_foto = 0;
- Foto* paktuelles_foto = 0;
- char szdateiname_mit_endung[260] = { 0 };
- puts("Bitte Namen des zu ladenden Albums eingeben");
- fflush(stdin);
- gets(szdateiname);
- //Dateiendung hinzufügen
- strcpy(szdateiname_mit_endung, szdateiname);
- strcat(szdateiname_mit_endung, ".bin");
- FILE* pdatei = fopen(szdateiname_mit_endung, "rb");// rb ist zum lesen. i open my datei with rb
- if(pdatei == 0)
- {
- return 0;
- }
- rewind(pdatei);
- while(!feof(pdatei))//file end of file(so lange nicht ende der datei) es überprüft
- {
- pletztes_foto = paktuelles_foto;
- paktuelles_foto = calloc(1, sizeof(Foto));//reserviert speicher für 1 foto
- if (fread(paktuelles_foto, 1, sizeof(Foto), pdatei) < sizeof(Foto)) // le datei et size offoto st enregistre ds la foto akt
- {
- // ende der datei, kein vollständiges foto konnte geladen werden
- free(paktuelles_foto);// speicher frei
- paktuelles_foto = pletztes_foto;
- break;
- }
- //pointer richtig setzen
- if(pletztes_foto)
- {
- pletztes_foto->pnaechstes_foto = paktuelles_foto;
- paktuelles_foto->pvorheriges_foto = pletztes_foto;
- }
- else
- {
- paktuelles_foto->pvorheriges_foto = 0;
- }
- paktuelles_foto->pnaechstes_foto = 0;
- }
- fclose(pdatei);
- return paktuelles_foto;
- }
- void AlbumAnzeigen(Foto* pliste)
- {
- int iwahl = 0;
- do
- {
- system("cls");
- if (pliste)
- {
- puts("Aktuelles Foto ist:");
- FotoDetailsAnzeigen(pliste);
- puts("\n[n] naechstes Foto\t[v] vorheriges Foto\n[a] Foto anzeigen\t[e] Aktuelles Foto entfernen\n[s] Foto suchen\t\t[x] Zurueck");
- fflush(stdin);
- iwahl = _getch();
- switch (iwahl)
- {
- case 'n':
- if (pliste->pnaechstes_foto)
- {
- pliste = pliste->pnaechstes_foto;
- }
- break;
- case 'v':
- if (pliste->pvorheriges_foto)
- {
- pliste = pliste->pvorheriges_foto;
- }
- break;
- case 'a':
- FotoAnzeigen(pliste->szdateiname);
- break;
- case 'e':
- pliste = FotoEntfernen(pliste);
- if (!pliste) //Liste ist jetzt leer
- {
- system("cls");
- puts("Das letzte Foto in dem Album wurde entfernt");
- _getch();
- }
- break;
- case 's':
- pliste = AlbumDurchsuchen(pliste);
- break;
- case 'x':
- break;
- default:
- puts("Ungueltige Auswahl!");
- _getch();
- break;
- }
- }
- else
- {
- puts("Kein Foto im Album vorhanden");
- _getch();
- break;
- }
- }
- while ( iwahl != 'x' );
- system("cls");
- }
- void FotoDetailsAnzeigen(Foto* pliste)
- {
- printf("Name: %s\n", pliste->szdateiname);
- printf("Aufnahmedatum: %s\n", pliste->szdatum);
- printf("Aufnahmeort: %s\n", pliste->szort);
- printf("Kurzbeschreibung: %s\n", pliste->szkurzbeschreibung);
- puts("------------------------------");
- if(pliste->pvorheriges_foto)
- {
- printf("Vorheriges Foto: %s\n", pliste->pvorheriges_foto->szdateiname);
- }
- else
- {
- puts("Dies ist das erste Foto im Album");
- }
- if (pliste->pnaechstes_foto)
- {
- printf("Naechstes Foto: %s\n", pliste->pnaechstes_foto->szdateiname);
- }
- else
- {
- puts("Es ist kein weiteres Foto vorhanden");
- }
- }
- void FotoAnzeigen(char* szdateiname)
- {
- char szdateiname_mit_endung[260] = { 0 };
- //Dateiendung hinzufügen
- strcpy(szdateiname_mit_endung, szdateiname);
- strcat(szdateiname_mit_endung, ".jpg");
- puts("Foto wird im Bildanzeigeprogramm geoeffnet...");
- system(szdateiname_mit_endung);
- _getch();
- }
- Foto* FotoEntfernen(Foto* pfoto)
- {
- if(!pfoto)
- {
- return 0;
- }
- if(pfoto->pvorheriges_foto)
- {
- if(pfoto->pnaechstes_foto)
- {
- //FALL 1: Foto hat Vorgänger und Nachfolger
- pfoto->pvorheriges_foto->pnaechstes_foto = pfoto->pnaechstes_foto; //mn pointeur montre les diff foto (zeiger)
- pfoto->pnaechstes_foto->pvorheriges_foto = pfoto->pvorheriges_foto;
- }
- else
- {
- //FALL 2: Foto war letztes Foto
- pfoto->pvorheriges_foto->pnaechstes_foto = 0;
- }
- Foto* fneues_aktuelles_foto = pfoto->pvorheriges_foto;
- free(pfoto);
- return fneues_aktuelles_foto;
- }
- //FALL 3: Foto war erstes Foto
- if(pfoto->pnaechstes_foto)
- {
- pfoto->pnaechstes_foto->pvorheriges_foto = 0;
- Foto* fneues_aktuelles_foto = pfoto->pnaechstes_foto;
- free(pfoto);
- return fneues_aktuelles_foto;
- }
- //FALL 4: Foto war einziges Foto
- free(pfoto); // enregistrem libre pr une foto
- return 0;
- }
- Foto* FotoHinzufuegen(Foto* pliste)
- {
- Foto* pneues_foto = calloc(1, sizeof(Foto));
- //printf("Speicher wurde an folgender Adresse allokiert: %p\n", pneues_foto);
- if (pneues_foto)
- {
- if(pliste)
- {
- pneues_foto->pvorheriges_foto = pliste;
- if(pliste->pnaechstes_foto) //einfügen
- {
- pneues_foto->pnaechstes_foto = pliste->pnaechstes_foto;
- pliste->pnaechstes_foto->pvorheriges_foto = pneues_foto;
- }
- else //anfügen
- {
- pneues_foto->pnaechstes_foto = 0;
- }
- pliste->pnaechstes_foto = pneues_foto;
- }
- //Liste ist noch leer
- else
- {
- pneues_foto->pvorheriges_foto = 0;
- pneues_foto->pnaechstes_foto = 0;
- }
- FotoDetailsEinlesen(pneues_foto);
- puts("Foto wurde hinzugefuegt");
- return pneues_foto;
- }
- else
- {
- puts("Fehler beim allokieren von Speicher!");
- return pliste;
- }
- }
- void AlbumSpeichern(char* szdateiname, Foto* pliste)
- {
- if(pliste)
- {
- char szdateiname_mit_endung[260] = { 0 };
- //Dateiendung hinzufügen
- strcpy(szdateiname_mit_endung, szdateiname);
- strcat(szdateiname_mit_endung, ".bin"); // einfügen
- FILE* pdatei = fopen(szdateiname_mit_endung, "wb");
- rewind(pdatei);
- if(pdatei)
- {
- while(pliste->pvorheriges_foto) //springe zu erstem foto in liste
- {
- pliste = pliste->pvorheriges_foto;
- }
- while(pliste)
- {
- fwrite(pliste, 1, sizeof(Foto), pdatei);
- pliste = pliste->pnaechstes_foto;
- }
- fclose(pdatei);
- }
- }
- }
- Foto* AlbumDurchsuchen(Foto* pliste)
- {
- if(pliste)
- {
- while(pliste->pvorheriges_foto) // springe zu anfang der liste
- {
- pliste = pliste->pvorheriges_foto;
- }
- char szsuchbegriff[100] = { 0 };
- int iwahl = 0;
- puts("Was soll gesucht werden?\n"
- "[o] Aufnahmeort\n"
- "[n] Name\n"
- "[d] Datum\n"
- "[k] Kurzbeschreibung\n");
- do
- {
- fflush(stdin);//löschte eingabe puffer(zwischen speicher)
- iwahl = _getch();
- }
- while(iwahl != 'o' && iwahl != 'n' && iwahl != 'd' && iwahl != 'k');
- puts("Bitte Suchbegriff eingeben");
- gets(szsuchbegriff);
- char* pkomponente = 0;
- if(iwahl == 'o') pkomponente = "Aufnahmeorte";
- if(iwahl == 'n') pkomponente = "Namen"; //ck jcherche lorsk jcompile mn programm les different compoosan
- if(iwahl == 'd') pkomponente = "Datumsangaben";
- if(iwahl == 'k') pkomponente = "Kurzbeschreibungen";
- printf("%s werden nach \"%s\" durchsucht...\n", pkomponente, szsuchbegriff);
- fflush(stdin);
- int itreffer = 0;
- int iindex = 0;
- while(1)
- {
- char* psz = 0;
- if(iwahl == 'o') psz = pliste->szort;
- if(iwahl == 'n') psz = pliste->szdateiname;
- if(iwahl == 'd') psz = pliste->szdatum;
- if(iwahl == 'k') psz = pliste->szkurzbeschreibung;
- if(strstr(psz, szsuchbegriff)) //der suchbegriff wird im psz gesucht mn psz est liete en haut
- {
- itreffer = itreffer + 1;
- printf("Treffer! Name: %s\tFotonummer: %i\n", pliste->szdateiname, iindex + 1);//index ces le numero dla foto
- }
- if(pliste->pnaechstes_foto)
- {
- pliste = pliste->pnaechstes_foto;
- iindex++;
- }
- else
- {
- break;
- }
- }
- if(itreffer == 0)
- {
- puts("Keine Suchergebnisse");
- _getch();
- }
- else
- {
- puts("Bitte Nummer des anzuzeigenden Fotos eingeben\n");
- int inummer = 1;
- fflush(stdin);
- scanf("%i", &inummer);
- while(pliste->pvorheriges_foto) // springe zu anfang der liste
- {
- pliste = pliste->pvorheriges_foto;
- }
- iindex = 0;
- while(iindex < inummer - 1)
- {
- if(pliste->pnaechstes_foto)
- {
- pliste = pliste->pnaechstes_foto;
- iindex++;
- }
- else
- {
- break;
- }
- }
- }
- }
- return pliste;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement