Seite 1 von 2

Bitte um Hilfeeeee

Verfasst: Fr Okt 24, 2014 2:50 pm
von hobbyflug
Hallo

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);
}
Lg Marcel

Edit by Xin: CodeFlags eingefügt

Re: Bitte um Hilfeeeee

Verfasst: Fr Okt 24, 2014 4:43 pm
von Xin
hobbyflug hat geschrieben:Hallo
Bin neu hier.
Stimmt... 1. Beitrag. ^^
hobbyflug hat geschrieben: 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?
Grübel... ich verstehe die Frage nicht.

Mir scheint, die Funktionsnamen sind relativ verständlich gewählt und auch die globale Variable ist eigentlich mit wenig Englischkenntnissen zu erahnen!?

Entweder Du kannst etwas C, dann kannst Du den Quelltext lesen und dazu konkrete Fragen stellen oder Du kannst kein C, dann weiß ich nicht wie ausführlich die Antwort sein müsste. Sie würde dann wohl erstmal lauten, dass Du doch bitte das C-Tutorial liest, um dann konkretere Fragen zu stellen. ^^
hobbyflug hat geschrieben:Es ist wirklich wichtig für mich!
Hausaufgaben?

Das Programm ist zu groß, um die erste Hausaufgabe zu sein. Es sieht auch nicht aus, als hätte es ein Lehrer geschrieben, sondern eher als wäre es von einem anderen Schüler kopiert worden. Ich glaube, da muss ich nochmals auf's C-Tutorial verweisen.

Re: Bitte um Hilfeeeee

Verfasst: So Okt 26, 2014 4:55 pm
von hobbyflug
ja ich kann C. Wir haben es in der Schule.

Meine Frage ist , ob mir jemand das Programm erklären kann, was "isEmtyausserLeerzeichen" und -->

Code: Alles auswählen

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));
macht. Sprich, damit ich weiß, wozu ich das im Programm verwenden muss.

Danke

lg

Edit by Xin: Erneut Code-Tags eingefügt

Re: Bitte um Hilfeeeee

Verfasst: Mo Okt 27, 2014 2:24 am
von Xin
hobbyflug hat geschrieben:ja ich kann C. Wir haben es in der Schule.

Meine Frage ist , ob mir jemand das Programm erklären kann, was "isEmtyausserLeerzeichen"
Das ist widersprüchlich. "isEmtyausserLeerzeichen" ist eine sehr kurze Funktion, die einen fragwürdigen Namen besitzt, aber ansonsten recht gerade wegprogrammiert ist. Was aus dieser Funktion verstehst du denn nicht?

hobbyflug hat geschrieben: und -->

Code: Alles auswählen

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));
macht. Sprich, damit ich weiß, wozu ich das im Programm verwenden muss.
Selbe Frage: Welchen Teil verstehst Du nicht?
strtok findest Du im Wiki.

Kommentiere den Quelltext doch erstmal für Dich durch und markiere die Stelle, wo Du Probleme hast. Es bringt Dich nicht weiter, wenn ich das für Dich tue.

Re: Bitte um Hilfeeeee

Verfasst: Mo Okt 27, 2014 7:34 am
von hobbyflug
Bei isEmtyausserLeerzeichen verstehe ich das nicht -->

Code: Alles auswählen

char c=str[i++];
       
if(c==0)
    return 1;
       
if(c!=' ' && c!='\t' && c!= '\n' && c!='\r')

und -->

Code: Alles auswählen

FILE *f = fopen(filename, "r");
int i, n, errcode;
errLinenumber = 0;
if (f == NULL)
    return -1
Ist das das selbe , wenn ich statt NULL eine 0 reinschreibe

Edit by cloidnerux: code-tags, Einrückungen

Re: Bitte um Hilfeeeee

Verfasst: Mo Okt 27, 2014 8:53 am
von Xin
Könntest Du Dir bitte die Code-Tags anschauen. Einfach oben mal auf "Code" drücken und den Quelltext dazwischen kopieren.
hobbyflug hat geschrieben:Bei isEmtyausserLeerzeichen verstehe ich das nicht -->

Code: Alles auswählen

char c=str[i++];
       
        if(c==0)
            return 1;
       
        if(c!=' ' && c!='\t' && c!= '\n' && c!='\r')
Du hast einen String und kopierst den Buchstaben an Stelle i. i wird um eins erhöht.
Ist der Buchstabe 0, wird die Funktion verlassen. Ist der Buchstabe nicht ' ', nicht '\t', nicht ’\n’, und nicht ’\r’, dann ...
Die escapten Zeichen sind Tab, NewLine und Rewind.
hobbyflug hat geschrieben: und -->

Code: Alles auswählen

FILE *f = fopen(filename, "r");
    int i, n, errcode;
    errLinenumber = 0;
    if (f == NULL)
        return -1
Ist das das selbe , wenn ich statt NULL eine 0 reinschreibe
NULL steht für einen Zeiger, der auf die Adresse 0 zeigt. Es ist das gleiche wie 0, aber bei einem Zeiger schreib trotzdem NULL, um zu demonstrieren, dass es sich um einen Zeiger handelt. Wie Du dem Vergleich mit einem Character auch besser if(c=='\0') schreibst. Inhaltlich ist das das gleiche, aber es dokumentiert besser, was Du da eigentlich tust.

Re: Bitte um Hilfeeeee

Verfasst: Mo Okt 27, 2014 12:17 pm
von hobbyflug
ok sry

also ob ich if(f == NULL) oder if(f == 0) schreibe ist egal, es verändert im Programm nichts

Re: Bitte um Hilfeeeee

Verfasst: Mo Okt 27, 2014 7:16 pm
von Xin
hobbyflug hat geschrieben:ok sry

also ob ich if(f == NULL) oder if(f == 0) schreibe ist egal, es verändert im Programm nichts
Im Ausführbarem Programm ändert sich dadurch nichts. Aber der Quelltext wird für den Menschen besser verständlich - insbesondere wenn die Projekte mal größer werden.

Re: Bitte um Hilfeeeee

Verfasst: Mo Okt 27, 2014 7:31 pm
von darksider3
"NULL" ist im Grunde tatsächlich gleich 0. Es ist aber nicht die Zahl, die dadurch repräsentiert werden soll, sondern eher das Ergebniss. 0 ist ja im grunde False; Also falsch. Aber wenn Du beispielsweise einen Passwortgeschützten Zugang zu XY schreibt, musst Du ja prüfen, ob alles ausgefüllt wurde(Passwort...). Sowas wäre ein größeres Projekt, wie Xin glaube ich meint( Beispiel halt.^^). Wenn die länge gleich NULL ist, soll das einfach "Leer" bedeuten, und nicht false.

So jedenfalls habe ich mir das mal beigebracht.

Re: Bitte um Hilfeeeee

Verfasst: Mo Okt 27, 2014 8:39 pm
von hobbyflug
Super danke!!!!!!

Kann mir wer sagen, warum dieses Programm nicht funktioniert?

Code: Alles auswählen

/* 
 * File:   main.c
 * Author: Marcel
 *
 * Created on 24. Oktober 2014, 16:52
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*
 * 
 */

struct Mensch
{
    char name[25];
    char nationalitaet[30];
    char wohnort[20];
    int alter;
};

int errLinenumber;

void ausgabe (struct Mensch b , int i)
{
    printf("Mensch: \n");
    printf("Name: %s \n", b.name);
    printf("Nationalitaet: %s \n", b.nationalitaet);
    printf("Wohnort: %s \n", b.wohnort);
    printf("Alter: %d \n", b.alter);
}

struct Mensch getMensch()
{
    struct Mensch b;
    char s[100];
    
    printf("\n");
    
    do
    {
        printf("Name:");
        fgets(s,sizeof s, stdin);
    }
    while (strlen(s)==0);
    
    s[strlen(s)-1]=0;                        //\n weg bei der Ausgabe
    strncpy(b.name, s, sizeof (b.name)); 

    do
    {
        printf("Nationalitaet:");
        fgets(s,sizeof s,stdin);
    }
    while (strlen(s)==0);
    
    s[strlen(s)-1]=0;                       //\n weg bei der Ausgabe
    strncpy(b.nationalitaet, s, sizeof (b.nationalitaet));
    
    do
    {
        printf("Wohnort:");
        fgets(s,sizeof s, stdin);
    }
    while (strlen(s)==0);
    
    s[strlen(s)-1]=0;                       //\n weg bei der Ausgabe
    strncpy(b.wohnort, s, sizeof (b.wohnort));
    
    do
    {
        printf("Alter:");
        fgets(s,sizeof(s),stdin);
        sscanf(s, "%d", &b.alter);
    }
    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;
    }
}


int leseausDatei (char filename[], struct Mensch feld[], int feldmax)
{
    //f = Filehandler
    
    FILE *f = fopen (filename, "r");
    int i; 
    int n; 
    int errcode;
    
    errLinenumber = 0;
    
    if (f == NULL)
        return -1;                  //Datei laesst sich nicht oeffnen 
    
    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 Mensch mensch;
    char *p;
    p=strtok(s, ",");
    
    if (p==NULL || isEmtyausserLeerzeichen(p))
        continue;                                               //leere Zeile?
    strncpy(mensch.name, p, sizeof(mensch.name));
        
    errLinenumber++;
        
    p=strtok(NULL, ",");       
    if (p==NULL)
    {
        errcode=-2;
        break;
    }
    strncpy(mensch.nationalitaet, p, sizeof(mensch.nationalitaet));
    
    p=strtok(NULL, ",");       
    if (p==NULL)
    {
        errcode=-3;
        break;
    }
    strncpy(mensch.wohnort, p, sizeof(mensch.wohnort));
        
    p=strtok(NULL, ",");
    if (p==NULL)
    {
        errcode=-4;
        break;
    }
    if(sscanf(p,"%d", &mensch.alter)!=1)
    {
        errcode=-4;
        break;
    }

        
    feld[n]=mensch;
    
    }
    
    fclose(f);
    return errcode;
}

int schreibeinDatei(char filename[], struct Mensch feld[], int feldmax)
{
    int i;
    FILE *f = fopen (filename, "w");
    if(f==NULL)
        return-1;
    
    for(i=0; i<=feldmax; i++)
    {
        struct Mensch *pb = &feld[i];
        fprintf(f,"%s",pb->name);
        fprintf(f,",%s",pb->nationalitaet);
        fprintf(f,",%s",pb->wohnort);
        fprintf(f,",%d",pb->alter);
        fprintf(f,"\n");
    }
    
    fclose(f);
    
    return 1;
    
}


int main(int argc, char** argv) 
{
    
    struct Mensch bibliothek[100];
    int i;
    int anzahl, err;
    
    printf("\tMensch:\n");
    printf("\t------\n\n");
    
    anzahl=leseausDatei("daten.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]=getMensch();
    
    err=schreibeinDatei("daten.csv", bibliothek, anzahl);
    if(err<=0)
    {
        printf("Fehler beim Lesen (code %d) in Zeile%d\n",err);
        return -2;
    }
    
    struct Mensch eins;
    //struct Mensch zwei={"Max Mustermann","Italien","Lignano",28};// nur beim Anlegen der Struktur

    
    eins.alter = 16;
    strncpy(eins.name,  "Marcel", sizeof(eins.name));
    strncpy(eins.nationalitaet,  "Oesterreich", sizeof(eins.nationalitaet));
    strncpy(eins.wohnort, "Leibnitz", sizeof(eins.wohnort));
 
      
    bibliothek[0]=  eins;
    //bibliothek[1]=   zwei;

    
    
    for (i=0;i<4;i++)
        ausgabe(bibliothek[i], i+1);
    
    printf("\n\n");
    
    return (EXIT_SUCCESS);
}

daten.csv

Marcel Maier , Oestrreich , Leibnitz , 16
Sven de Cou , Schweiz , Neucatel , 16
Lukas Mueller , Deutschland , Berlin , 40


danke

lg