Bin neu hier.
Habe eine Frage zu diesen C Programm:
Kann mir das Programm jemand kurz erklären?
für was was ist, zb. struct Buch getBuch() ; int errLinenumber ; int leseausdatei(char filename[], struct Buch feld[], int feldmax) ;oder int isEmtyausserLeerzeichen(char str[]) und welche Aufgabe es im Programm hat?
Es ist wirklich wichtig für mich!
Danke
Code: Alles auswählen
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
*/
struct Buch
{
char titel[50];
char autor[30];
int erscheinungsjahr;
double preis;
};
int errLinenumber;
void ausgabe (struct Buch b, int i)
{
printf("\nBuch %d\n",i);
printf(" Titel: %s \n",b.titel);
printf(" Autor: %s \n",b.autor);
printf(" Erscheinungsjahr: %d \n",b.erscheinungsjahr);
printf(" Preis: %.2lf \n",b.preis);
}
struct Buch getBuch()
{
struct Buch b;
char s[80];
printf("\n");
do
{
printf("Titel:");
fgets(s,sizeof s, stdin);
}
while (strlen(s)==0);
s[strlen(s)-1]=0;//\n weg bei der Ausgabe
strncpy(b.titel, s, sizeof (b.titel));
do
{
printf("Autor:");
fgets(s,sizeof s, stdin);
}
while (strlen(s)==0);
s[strlen(s)-1]=0;
strncpy(b.autor, s, sizeof (b.autor));
do
{
printf("Preis:");
fgets(s,sizeof s, stdin);
sscanf(s,"%lf",&b.preis);
}
while (strlen(s)==0 || b.preis<0.0);
do
{
printf("Jahr:");
fgets(s,sizeof s, stdin);
sscanf(s,"%d",&b.erscheinungsjahr);
}
while (strlen(s)==0);
return b;
}
int isEmtyausserLeerzeichen(char str[])
{
int i=0;
while(1)
{
char c=str[i++];
if(c==0)
return 1;
if(c!=' ' && c!='\t' && c!= '\n' && c!='\r')
return 0;
}
}
//fehler <0
//buecher>=0
int leseausdatei(char filename[], struct Buch feld[], int feldmax)
{
//f ist der Filehandler
FILE *f = fopen(filename, "r");
int i, n, errcode;
errLinenumber = 0;
if (f == NULL)
return -1;//datei lässt sich nicht öffnen
for(n=0;n>-1;n++)
{
char s[1024];
if (fgets(s,sizeof s, f)==NULL)
{
fclose (f);
errLinenumber = -1 ;
return n;
}
s[strlen(s)-1]=0;
struct Buch buch;
char *p;
p=strtok(s, ",");
if (p==NULL || isEmtyausserLeerzeichen(p))
continue;//leere Zeile?
strncpy(buch.titel, p, sizeof(buch.titel));
errLinenumber++;
p=strtok(NULL, ",");
if (p==NULL)
{
errcode=-2;
break;
}
strncpy(buch.autor, p, sizeof(buch.autor));
p=strtok(NULL, ",");
if (p==NULL)
{
errcode=-3;
break;
}
if(sscanf(p,"%d", &buch.erscheinungsjahr)!=1)
{
errcode=-4;
break;
}
p=strtok(NULL, ",");
if (p==NULL)
{
errcode=-5;
break;
}
if(sscanf(p,"%lf", &buch.preis)!=1)
{
errcode=-6;
break;
}
feld[n]=buch;
}
fclose(f);
return errcode;
}
int schreibeindatei(char filename[], struct Buch feld[], int feldmax)
{
int i;
FILE *f = fopen (filename, "w");
if(f==NULL)
return-1;
for(i=0;i<feldmax;i++)
{
struct Buch *pb = &feld[i];
fprintf(f,"%s",pb->titel);
fprintf(f,",%s",pb->autor);
fprintf(f,",%d",pb->erscheinungsjahr);
fprintf(f,",%lf",pb->preis);
fprintf(f,"\n");
}
fclose(f);
}
int main()
{
struct Buch bibliothek[100];
int i;
int anzahl, err;
printf("\tBuecherliste\n");
printf("\t------------\n\n");
anzahl=leseausdatei("file1.csv", bibliothek, 100);
if(anzahl<=0)
{
int error=anzahl;
printf("Fehler beim Lesen (code %d) in Zeile%d\n",error, errLinenumber);
return -1;
}
for (i=0;i<anzahl;i++)
ausgabe(bibliothek[i], i+1);
bibliothek[6]=getBuch();
err=schreibeindatei("file1.csv", bibliothek, anzahl);
if(err<=0)
{
printf("Fehler beim Lesen (code %d) in Zeile%d\n",err);
return -2;
}
struct Buch meinErstesBuch;
struct Buch meinZweitesBuch={"Max und Moriz","Wilhelm Busch",1845,10.99}; // nur beim Anlegen der Struktur
struct Buch meinDrittesBuch;
meinErstesBuch.preis = 120.99;
strncpy(meinErstesBuch.autor, "Kehlmann", sizeof(meinErstesBuch.autor));
strncpy(meinErstesBuch.titel, "Die Vermessung der Welt", sizeof(meinErstesBuch.titel));
meinErstesBuch.erscheinungsjahr =2007;
meinDrittesBuch = getBuch();
bibliothek[0]=meinErstesBuch;
bibliothek[1]=meinZweitesBuch;
bibliothek[2]=meinDrittesBuch;
for (i=0;i<4;i++)
ausgabe(bibliothek[i], i+1);
printf("\n\n");
return (0);
}
Edit by Xin: CodeFlags eingefügt