A
Hallo,
ich habe folgendes Problem. Wir sollen fürs Studium einen kleinen C Beleg anfertigen. Ich wählte da das Standardteil nämlich eine CD Verwaltung.
Nun bin ich fast fertig, ich kann Datensätze(in Form von struct) in die Datei reinschreiben. Ich kann sie auch auslesen.
Jetzt kommt mein Problem ins Spiel. Wenn ich versuche die Dateien auslesen klappt das auch bis zum 25. Datensatz und dann kommt nichts mehr in das konsolenfenster. mit dem hex-editor zeigt sich aber das mehr als 25 Datenätze drin stehen.
Hier mal mein C-Quellcode
Vielleicht hat jemand einen Tipp wie es gehen könnte.
Ich gebe euch mal nur die wesentlichen Teile. Die Öffnenfunktion, Die Eingabe und die Ausgabefunktion
Hier mal die Funktion zum öffnen der Datei
int dateienoeffnen()
{
//--------------Variablen-----------------
int i;
DIR *dir;
char openfile[255];
char buf[200];
//--------------Variablen-----------------
system("cls");
printf("Dateien - \231ffnen einer Datensatzdatei\n");
printf("-------------------------------------\n\n\n");
printf("Folgende Datensatzdateien existieren.\n\n");
if(getcwd(buf,sizeof(buf)) == NULL)
{
fprintf(stderr, "Fehler bei getcwd!\n");
}
strcat(buf,"\\DSFile\\");
if((dir=opendir(buf)) != NULL)
{
while((dirzeiger=readdir(dir)) != NULL)
//Durchsucht das aktuelle Verzeichnis und listet alle Dateien auf
{
printf("%s\n",(*dirzeiger).d_name);
}
printf("\n\n");
}
printf("Wie soll die zu \231ffnende Datei hei\341en: ");
fgets(openfile,24,stdin);
openfile[strlen(openfile)-1]='\0';
strcat(buf,openfile);
if((f=fopen(buf,"rb+"))==NULL)
{
printf("Datei existiert nicht.\n\n");
printf("Weiter mit beliebiger Taste.\n");
getch();
bopend = 0;
legende();
return bopend; //Datei nicht geöffnet
}
else
{
printf("Datei \'%s\' exitiert und wurde ge\224ffnet\n",openfile);
bopend = 1;
legende();
return bopend;//Datei geöffnet
}
return i;
}
void erfassen(check)
{
//--------------Variablen-----------------
short int dssize; //Größe des Datensatzes in Byte
long filesize; //Dateigröße in Byte
short int dsanz; //systemseitige Datensatznummer
short int rating; // Wert für das Rating
short int titelanz; // Anzahl der Titel einer CD
short int jahr; // Erscheinungsjahr;
short int i;
//--------------Variablen-----------------
system("cls");
printf("Datenerfassung - Hinzuf\201gen von Datens\204tzen\n");
printf("-------------------------------------------\n\n");
/*if (check == 0)
{
printf("\n\n");
printf(" Es ist keine Datei zum Hinzuf\201gen ge\224ffnet.\n");
printf("\n\n");
getch();
legende();
}*/
checker(check);
fseek(f,0,SEEK_END);
dssize = sizeof(datensatz1);
filesize = ftell(f);
dsanz = filesize/dssize;
rewind(f);
printf("Anzahl der Datens\204tze betr\204gt: %d\n",dsanz);
dsanz = dsanz+1;
printf("Laufende Nummer dieses Datensatzes: %d\n",dsanz);
datensatz1.lfdnr = dsanz;
fflush(stdin);
printf("Bitte geben Sie den Titel des Mediums ein: ");
fgets(datensatz1.name,sizeof(datensatz1.name),stdin);
fflush(stdin);
datensatz1.name[strlen(datensatz1.name)-1]='\0';
printf("Bitte geben Sie den K\201nstler ein: ");
fgets(datensatz1.kuenstler,sizeof(datensatz1.kuenstler),stdin);
fflush(stdin);
datensatz1.kuenstler[strlen(datensatz1.kuenstler)-1]='\0';
printf("Verlag bei dem das Medium erschienen ist: ");
fgets(datensatz1.verlag,sizeof(datensatz1.verlag),stdin);
fflush(stdin);
datensatz1.verlag[strlen(datensatz1.verlag)-1]='\0';
printf("In welchem Jahr ist das Medium erschienen (bitte 4 stellig angeben): ");
scanf("%i",&jahr);
fflush(stdin);
datensatz1.jahr=jahr;
printf("Bitte bewerten zwischen:\n6 = besonders Gut\n1 = besonders schlecht: ");
scanf("%i",&rating);
fflush(stdin);
datensatz1.rating = rating;
printf("Bitte geben sie an f\201r:\nBuch = B\nCD = CD\nDVD = DVD ein: ");
fgets(datensatz1.typ,sizeof(datensatz1.typ),stdin);
datensatz1.typ[strlen(datensatz1.typ)-1]='\0';
i = strlen(datensatz1.typ);
while (0 <= i)
{
datensatz1.typ[i]=toupper(datensatz1.typ[i]);
i--;
}
fflush(stdin);
if((strcmp(datensatz1.typ,"B")==0))
{
printf("Welchen Einband hat das Buch:\nhc = Hardcover\npb = Paperback\n Bitte geben sie an: ");
fgets(datensatz1.buhc,sizeof(datensatz1.buhc),stdin);
datensatz1.typ[strlen(datensatz1.buhc)-1]='\0';
i = strlen(datensatz1.buhc);
printf("%i",i); getch();
while (0 <= i)
{
datensatz1.buhc[i]=toupper(datensatz1.buhc[i]);
i--;
}
fflush(stdin);
}
if (((strcmp(datensatz1.typ,"CD") ==0 )||(strcmp(datensatz1.typ,"DVD") == 0)))
{
printf("Hat das Medium ein Kopierschutz:\ncp = Kopiergesch\201tzt\nncp = nicht Kopiergesch\201tzt\n Bitte geben sie an: ");
fgets(datensatz1.copypro,sizeof(datensatz1.copypro),stdin);
datensatz1.copypro[strlen(datensatz1.copypro)-1]='\0';
i=strlen(datensatz1.copypro);
while (0<=i)
{
datensatz1.copypro[i]=toupper(datensatz1.copypro[i]);
i--;
}
}
if ((strcmp(datensatz1.typ,"CD") == 0 ))
{
printf("Anzahl der Titel auf der CD: ");
scanf("%i",&titelanz);
fflush(stdin);
datensatz1.anztitel=titelanz;
}
//Datensatz wird in Datei geschrieben
printf("Datensatz wird in der Datei gespeichert.\n");
fwrite(&datensatz1,sizeof(datensatz1),1,f);
printf("Speicherung beendet.\n");
}
Fehler werden bei der Eingabe noch nicht abgefangen
Hier folgt und nun die Funktion zum auslesen
void anzeigen(check)
{
//--------------Variablen-----------------
int i;
int dssize; //Größe des Datensatzes in Byte
long filesize; //Dateigröße in Byte
int dsanz;
//--------------Variablen-----------------
i = 0;
system("cls");
printf("Datenausgabe - Anzeigen von Datens\204tzen\n");
printf("---------------------------------------\n\n");
/*if (check == 0)
{
printf("\n\n");
printf(" Es ist keine Datei zum Anzeigen ge\224ffnet.\n");
printf("\n\n");
getch();
legende();
}*/
checker(check);
rewind(f);
fseek(f,0,SEEK_END);
dssize = sizeof(datensatz1);
filesize = ftell(f);
dsanz = filesize/dssize;
rewind(f);
if (dsanz != 0)
{
printf("Anzahl der Datens\204tze: %i\n",dsanz);
printf("%-2s %-35s%-35s\n","Nr","Name des K\201nstlers","Titel des Mediums");
linie(80);
//---------------------------------------18.03.06-------------------------------
while(fread(&datensatz1,sizeof(datensatz1),1,f))
{
printf("%-2d %-35s%-35s\n",datensatz1.lfdnr,datensatz1.kuenstler,datensatz1.name);
i++;
if(i%10==0)
{
printf("Weiter mit beliebiger Taste.\n");
getch();
system("cls");
printf("%-2s %-35s%-35s\n","Nr","Name des K\201nstlers","Titel des Mediums");
linie(80);
}
}
printf("\n");
linie(80);
printf("Anzeigen Ende\n");
printf("Weiter mit beliebiger Taste\n");
getch();
system("cls");
legende();
}
else
{
printf("\n\n");
printf(" Datensatzdatei ist leer! Keine Datenanzeige m\224glich.\n");
printf("\n\n");
printf("beliebige Taste dr\201cken");
getch();
legende();
}
}
Ich gebe hier nur zwei werte des strukts aus, da ich den Rest nicht auf den Bildschirm bekomme. Daher gibt es noch eine komplettanzeige
Hier ist bei 25 Datensätzen schluss.
Weiß vielleicht jemand wie man das Pproblem beheben kann.
Die Datendatei aus dem Order DSFile, die al Sammeldatei läuft kann ich dann gern auch per Mail rumschicken.
Danke schonmal für eure Hilfe