CD-Datenbank(Textdatei) - Welche Struktur?
-
natürlich kann es eine Binärdatei sein,wollte damit bloß sagen das ich keine datenbank zur verfügung habe.
ich muss zu der aufgabe noch sagen,das es dann nämlich als cgi-datei im netz aufrufbar sein soll.
Wie würde man die datei dann auslesen,könntet ihr mir einen simplen quellcode schreiben oder gibt es da nicht ein tutorial??
-
IronGiant schrieb:
natürlich kann es eine Binärdatei sein,wollte damit bloß sagen das ich keine datenbank zur verfügung habe.
ich muss zu der aufgabe noch sagen,das es dann nämlich als cgi-datei im netz aufrufbar sein soll.
Wie würde man die datei dann auslesen,könntet ihr mir einen simplen quellcode schreiben oder gibt es da nicht ein tutorial??
Wenns für dein Studium, dann kannst du ja auch ruhig ein bisschen Hirnschmalz reinsetzen. Was ist eine cgi-datei? Und warum machst du es nicht mit PHP, wenn es fürs Internet sein soll?
-
würde es zu gerne mit php machen,wir sollen es aber in c schreiben und per compiler die datei *.c in *.cgi compilieren.
und hirnschmalz kann ich da leider nicht reinschreiben, das teil ist prüfungsvoraussetzung,leider
-
IronGiant schrieb:
würde es zu gerne mit php machen,wir sollen es aber in c schreiben und per compiler die datei *.c in *.cgi compilieren.
und hirnschmalz kann ich da leider nicht reinschreiben, das teil ist prüfungsvoraussetzung,leider
Sicher das du studierst? Sicher das du verstanden hast, was Common Gateway Interface bedeutet? Es heißt einfach, dass dein Programm mit den GET bzw. POST Inhalten aufgerufen wird, und seine Ausgabe vom Webserver an den Rufenden zurückgeschickt wird. Überleg dir erst mal wie du dein Programm ohne cgi-Umgebung realisierst, also die Interna der Datenverwaltung und des Zugriffs, und dann kümmerst du dich um cgi.
-
Bei Binärdateien kannst du die Datensätze sehr leicht mit fread() und fwrite()
auslesen und schreiben.Als Datenstruktur würde ich folgendes verwenden:
struct CD { char name[255]; char interpret[255]; char genre[255]; float preis; int nummer; CD *next; };
Mit dem Zeiger *next findest du immer das nächste Element bzw. den nächsten
Datensatz, nun benötigst du noch eine Funktion die dynamisch ein neues Objekt
des Typs CD anfordert.
Du solltest auf jeden Fall überprüfen ob die Namen nicht die 255 Zeichen
überschreiten oder du musst es über ein dynamisches Array lösen.
Wenn du C++ verwenden darfst würd ich dir zu C++ raten, dort kannst du das
durch den Typ String umgehen.
-
wie kann ich mir die Binärdatei denn vorstellen wenn darin was geschrieben wurde?
kannst du mir eine kleine einlese und schreibe function basteln,an der ich sehe wie es prinzipiel geht???
nein leider kann ich kein c++ benutzen,da dieser beleg für das fach c ist.
c++ kommt noch im nächsten semester.
-
SirLant schrieb:
Bei Binärdateien kannst du die Datensätze sehr leicht mit fread() und fwrite()
auslesen und schreiben.Als Datenstruktur würde ich folgendes verwenden:
struct CD { char name[255]; char interpret[255]; char genre[255]; float preis; int nummer; struct CD *next; };
Kleiner Fehler, in ANSI-C muss man struct CD schreiben.
#include <stdio.h> #include <string.h> #include <stdlib.h> struct CD { char name[255]; char interpret[255]; char genre[255]; float preis; int nummer; struct CD *next; }; int main(void) { FILE* datei; struct CD eingabe, ausgabe; strncpy(ausgabe.name, "Smells Like Teen Spirit", sizeof ausgabe.name); strncpy(ausgabe.interpret, "Nirvana", sizeof ausgabe.interpret); strncpy(ausgabe.genre, "Grunge", sizeof ausgabe.genre); ausgabe.preis = 10.0; ausgabe.nummer = 1; ausgabe.next = NULL; if(NULL != (datei = fopen("cdliste.dat", "wb"))) { fwrite(&ausgabe, sizeof ausgabe, 1, datei); fclose(datei); } else { fputs("Dateiausgabe fehlgeschlagen\n", stderr); exit(EXIT_FAILURE); } if(NULL != (datei = fopen("cdliste.dat", "rb"))) { fread(&eingabe, sizeof eingabe, 1, datei); fclose(datei); } else { fputs("Dateieingabe fehlgeschlagen\n", stderr); exit(EXIT_FAILURE); } return EXIT_SUCCESS; }
-
Stimmt, deswegen schreib ich gewöhnlich ein typedef davor, hatte ich da allerdings
vergessen.Eine Binärdatei ist einfach eine Datei aus einsen und nullen und du liest eben
xBytes ein, soviele Bytes wie die Struktur groß ist. Und je nach Position des Bytes
wird es eben als Zeichen,Integer oder Fließkommazahl interpretiert.Ich habe hier ein ganz tolles Beispiel auf meiner Festplatte gefunden:
/* Eine einfache Adressenliste die ein Array aus Strukturen verwendet. */ #include <stdio.h> #include <stdlib.h> #define MAX 100 struct addr { char name[30]; char street[40]; char city[20]; char state[3]; unsigned long int zip; } addr_list[MAX]; void init_list (void); void enter (void); void delete (void); void list (void); void load (void); void save (void); int menu_select (void); int find_free (void); int main (void) { char choice; init_list (); /* Initialisiert das Struktur-Array */ for (;;) { choice = menu_select (); switch (choice) { case 1: enter (); break; case 2: delete (); break; case 3: list (); break; case 4: save (); break; case 5: load (); break; case 6: exit (0); break; } } return 0; } /* Initialisiere die Liste */ void init_list (void) { register int t; for (t = 0; t < MAX; t++) addr_list[t].name[0] = '\0'; } /* Beschaffe eine Menueauswahl */ int menu_select (void) { char s[80]; int c; printf ("1. Einen Namen eingeben\n"); printf ("2. Einen Namen loeschen\n"); printf ("3. Die Datei auflisten\n"); printf ("4. Die Datei speichern\n"); printf ("5. Die Datei laden\n"); printf ("6. Beenden\n"); do { printf ("\nGeben Sie Ihre Wahl ein: "); gets (s); c = atoi (s); } while (c < 0 || c > 6); return c; } /* Gib die Adressen in die Liste ein */ void enter (void) { int slot; char s[80]; slot = find_free (); if (slot == 1) { printf ("\nListe voll."); return; } printf ("Geben Sie einen Namen ein: "); gets (addr_list[slot].name); printf ("Geben Sie eine Strasse ein: "); gets (addr_list[slot].street); printf ("Geben Sie eine Stadt ein: "); gets (addr_list[slot].city); printf ("Geben Sie ein Land ein: "); gets (addr_list[slot].state); printf ("Geben Sie eine Postleitzahl ein: "); gets (s); addr_list[slot].zip = strtoul(s, '\0', 10); } /* Finde eine unbenutze Struktur */ int find_free (void) { register int t; for (t = 0; addr_list[t].name[0] && t < MAX; t++) ; if (t == MAX) return -1; // Keine Plätze mehr frei return t; } /* Loesche eine Adresse */ void delete (void) { register int slot; char s[80]; printf ("Geben Sie einen Eintrag ein #: "); gets (s); slot = atoi (s); if (slot >= 0 && slot < MAX) addr_list[slot].name[0] = '\0'; } /* Zeige die Liste auf dem Bildschirm an */ void list (void) { register int t; for (t = 0; t < MAX; t++) { if (addr_list[t].name[0]) { printf ("%s\n", addr_list[t].name); printf ("%s\n", addr_list[t].street); printf ("%s\n", addr_list[t].city); printf ("%s\n", addr_list[t].state); printf ("%lu\n\n", addr_list[t].zip); } } printf ("\n\n"); } /* Speichere die Liste */ void save (void) { FILE *fp; register int i; if ((fp =fopen ("maillist", "wb")) == NULL) { printf ("Kann die Datei nicht oeffnen."); return; } for (i = 0; i < MAX; i++) { if (*addr_list[i].name) { if (fwrite (&addr_list[i], sizeof (struct addr), 1, fp) != 1) { printf ("Dateischreibfehler."); } } } fclose (fp); } /* Lade die Datei */ void load (void) { FILE *fp; register int i; if ((fp = fopen ("maillist", "rb")) == NULL) { printf ("Kann die Datei nicht oeffnen."); return; } init_list (); for (i = 0; i < MAX; i++) { if (fread (&addr_list[i], sizeof (struct addr), 1, fp) != 1) { if (feof (fp)) break; printf ("Dateilesefehler."); } } fclose (fp); }
Das Menü musst du halt als HTML-Seite machen und die MAX100 entfernen, wenn du
kein Limit haben möchtest.
-
folgender Link könnte für dich interessant sein
http://steveheller.com/opt/superm.htm(ist zwar eigentlich für C++, doch der Artikel arbeitet theoretisch und der Code sieht IMHO mehr nach C aus, als nach C++ ;))
-
Hi IronGiant,
[Neugier]was studierst du denn???[/Neugier]
-
Also ich studier Medieninformatik im 1.Semester in Dresden.
Mir ist aufgefallen das ich auch eine Trackliste zu jeder CD speichern muss,hab deshalb die strucktur unterstrukturiert.
Das sieht nun wie folgt aus:Ist das so richtig oder sollte ich was verändern?struct tracks {
int tnum;
char titel[50];
char mp3[50];
struct tracks *next;
};struct CD {
char name[255];
char interpret[255];
char genre[255];
float preis;
int nummer;
struct tracks trackliste[40];
struct CD *next;
};Ist das *next so wichtig-Es geht ja auch ohne.
Ich arbeite die Struktur mit eine For-schleife ab.for(i=0;i<=2;i++){
if(eingabe[i].name!=0){
printf("Nummer:%d\n",eingabe[i].nummer);
printf("Name:%s\n",eingabe[i].name);@all
Danke für eure Hilfe
-
Also ich studiere Medieninformatik im 1.Semester in Dresden.
@tobidope & SirLant
Mir ist aufgefallen das ich auch eine Trackliste zu jeder CD speichern muss,hab deshalb die strucktur unterstrukturiert.
Das sieht nun wie folgt aus:Ist das so richtig oder sollte ich was verändern?struct tracks { int tnum; /*Nummer des Tracks*/ char titel[50]; /*Titel des Tracks*/ char mp3[50]; /*Probedatei des Tracks*/ struct tracks *next; }; struct CD { char name[255]; char interpret[255]; char genre[255]; float preis; int nummer; struct tracks trackliste[40]; struct CD *next; }; struct CD eingabe[20], ausgabe[20];
Ich arbeite die Struktur mit einer For-schleife ab.
for(i=0;i<=20;i++){ printf("Nummer:%d\n",eingabe[i].nummer); printf("Name:%s\n",eingabe[i].name); }
Da brauch ich doch das *next nicht oder???
wie kann ich gezielt nach eingabe der nummer einen eintrag löschen??
@all
Danke für eure Hilfe
-
Du möchtest eine verkettete Liste haben. Wenn du dir die programmiert hast, dann wirst du wissen, wie man das macht. Nimm ein gutes C-Buch zur Hand und schau da mal rein. Oder einmal bei Google verkettete Liste reinschreiben. Da wirst du Beispiele ohne Ende finden. Ansonsten kann dir ja jemand den Quellcode reipasten.
-
Eieiei
Wollt ihr den armen Kerl erschlagen? Er weiß noch nicht mal genau wie man am besten eine Datei ausliest und dann soll er gleich noch lernen wie verkettete Listen funktionieren
@Iron
Ich würde es an deiner Stelle erst mal so machen, dass du die Daten der Datei in Variblen liest. Also in einen Array deiner Struktur (am besten mit dynamischer Speicherreservierung, falls dir das was sagt. Wenn nicht, dann such mal nach malloc() und realloc()). Danach arbeitest du in deinem Programm nur noch mit dem Array. Wenn du etwas hinzufügst, dann machst du das am Array. Wenn du etwas löschst, dann machst du das am Array. Wenn du mit dem ganzen fertig bist, dann speicherst du das Array wieder in der Datei und überschreibst somit die alten Daten der Datei mit den neuen Daten im Array. Am einfachsten ist es, denke ich, mit fwrite() und fread() (wie ja schon mal erwähnt wurde).Schöner wäre das ganze natürlich mit verketteten Listen, aber das muss man erstmal richtig verstehen und man muss mit Zeigern gut umgehen können.
Für dein cgi musst du dir sowieso noch was überlegen, weil du das Programm mehrmals mit verschiedenen Parametern aufrufen musst, z. B. hinzufügen, löschen, ändern, anzeigen. Für jede Benutzeraktion, die sich auf die Daten auswirkt, ist ein Aufruf des Programms nötig. Aber das würde ich erst später machen. Bring das Programm erstmal so zum Laufen.
Kleiner Tipp noch. Verwende für jede Aktion eine eigene Funktion, dann tust du dich bei der Umstellung auf cgi später nicht so schwer
-
Wer Informatik studiert wird doch wohl noch schnell das Prinzip verketteter Listen
lernen können :p
-
Im 1. Semester?
Wenn C(++) das Hauptfach ist, dann vielleicht, aber so, denke ich, ist das doch etwas kompliziert auf einmal. Allerdings muss er das ja selber wissen
-
Das mit den veketteten Listen hab ich jetzt verstanden,war doch nicht so schwer wie es aussah :p
Eins muss ich noch loswerden:
Die Aufgabe war doch etwas anders als ich sie hier geschrieben habe, da ich vermutet hatte das die Antworten zu sehr von meinem Kernproblem abweichen.Sie lautet nämlich so:
Belegaufgabe im Fach Programmiersprachen 1
Zu programmieren ist mit der Programmiersprache C ein CGI-Skript, das einen fiktiven
Internet-Katalog zum Verkauf von Audio-CDs steuert. Wird das CGI- Skript ohne weitere
Parameter aufgerufen, dann wird die Titelseite des Katalogs angezeigt, auf dem der Name
des Kunden und seine Email-Adresse in ein Formular eingetragen und zwischen mindestens
2 versch. Sparten (z.B. Klassik und Jazz) gewählt wird. Nach dieser Seite wird der
Kunde jeweils mit Namen angesprochen und findet pro Sparte jeweils mindestens 2 Audio-CDs
im Angebot. Wählt er eine CD aus, so bekommt er das Cover der CD, den Verkaufspreis
und eine Titelliste angezeigt. Von mindestens einem Titel der CD sollte eine Sound-Datei
(max. 10 bis 20 Sekunden, niedrige Samplefrequenz) zum "Probehören"
heruntergeladen werden können.Note 3:
Durch ein entsprechendes Icon kann die CD in den Warenkorb als Bestellung
übernommen werden. Bestellte CDs sind in einer Datei "bestellung.txt" mit dem Namen des
Bestellers auf dem Web-Server abzuspeichern .Note 2:
Der aktuelle Warenkorb (mit den bestellten Audio-CDs) wird auf allen Seiten mit
Bestelldatum, Einzel- und Gesamtpreis angezeigt.Note 1:
Es ist möglich, CDs wieder aus dem Warenkorb zu entfernen. Es werden parallel
agierende Kunden korrekt unterschieden. Ein Kunde sieht nur seinen eigenen Warenkorb.Note 1 und 10 Prüfungspunkte:
Die Verkaufsabteilung Ihres fiktiven Unternehmens kann
die Bestellliste mit dem WEB-Browser abarbeiten. Hierzu dient ein weiteres CGI-Skript,
das die Eingabe eines Passwortes erwartet. Bei Korrektheit dieses Passwortes wird die
gesamte Bestelliste sortiert nach Kunden angezeigt. Einzelne Einträge können gelöscht
werden. Wenn ein Eintrag gelöscht wird, soll sein Inhalt mit dem mail-Kommando des
Server- Rechners an den Kunden geschickt werden
(Betreff: Bearbeitet).Das Problem bei dem ganzen war,dass wir noch nicht mal C richtig können und dann müssen wir das ganze noch in cgi machen.
Die Dateiausgabe haben wir sehr nachlässig behandelt.
Und die Strukturen haben wir nur in der Vorlesung gehabt und sind noch nicht mal im Praktikum nähe darauf eingegangen.Naja zum Glück bin ich hiermit fast fertig.
Es fehlt nur noch der Admin-Bereich.Danke nochmal an alle
-
Hallo SirLant,
ich weiß zwar, daß dieser Beitrag schon etwas älter ist aber,
das Programm von dir finde ich super.Ich habe hier ein ganz tolles Beispiel auf meiner Festplatte gefunden:
Es beinhaltet nahezu alles, womit ich mich im Moment befasse.
Da ich nicht studiere und C autodidaktisch erlerne, ist so ein
Programm immer eine willkommene Erweiterung zu meiner Lektüre.
Ich kopiere nichts. Mir geht es nur um das Verständnis.
Mit 'strg c' und 'strg v' würde ich sowieso nichts lernen.Wünsche allen hier im Forum schon mal einen guten Rutsch ins neue Jahr.