[C] Probleme mit struct & Funktionsaufruf

TheJ

Grünschnabel
Moi,
ich schildere mal meine Aufgabenstellung:
Ich soll eine txt Datei auslesen und diese Werte in ein struct speichern. So schaut die Struktur aus:
Artikelnummer:1
Artikelname:pC Gehäuse
Preis pro Artikel:24.98
Stueckzahl:20
Mindestmenge:3

Mein struct schaut in dem Fall so aus:
Code:
    struct artikel{
        int a_nr;               //Artikel Nummer
        char a_name;            //Artikel Name
        float a_price;          //Artikel Preis  
        int a_item;             //Anzahl der Artikel
        int a_min_item;         //Mindestmenge
    };

Ich muss also "Peter" in name speichern und "15" in alter. Dazu lese ich die die Datei zeilenweise aus (Reader Funktion) und für jede Zeile wird eine andere funktion (compare Funktion) aufgerufen die für das teilen, interpretieren des Strings verantwortlich ist ("PC Gehäuser" muss ja von "Artikelname:" getrennt werden). In dieser Funktion sollen die Daten auch gleich ins struct gespeichert werden.

Mein Problem:
Ich muss das struct ja in die Reader Funktion deklarieren richtig? Denn wenn ich es in der compare Funktion deklariere, wird es ja in für Zeile überschrieben.
Nun weiß ich nicht genau wie ich das mit dem Übergabeparameter machen soll, das klappt nicht wie ich es möchte. So war mein Ansatz:

Das Zeilenweise auslesen + Funktionsaufruf
Code:
struct artikel *a_list;

for(i = 0; i < lineNum; i++) {          
    fgets(line[i], 50,file);                                           
    compare(line[i], *a_list);        
}

Interpreter Funktion
Code:
struct artikel *compare(char line[][50], struct artikel *a_list){

/*hier wird der String verarbeitet und in das struct gespeichert...*/


return a_list;  //struct soll zurückgegeben werden

}

Der Fehler scheint bei dem Funktionsaufruf vom interpreter zu sein, nur weiß ich nicht wie es richtig ist. Ich hoffe ich habe mein Problem verständlich rüberbringen können. Wenn nicht, einfach fragen.


//EDIT
 
Zuletzt bearbeitet:
Hi und Willkommen bei tutorials.de,

zuerst mal: das "char name" in der struct ist nur ein einzelner Buchstabe.
Du brauchst ein Array, zB. "char name[100]"

Gibts in der Dati nur einen Namen mit Alter oder mehrere?
Zeigst du vllt. einmal den ganzen Code?
 
Ahh...ja ich poste mal den ganzen code. Nur ich habe bei der Aufagabenstellung andere Namen etc verwendet, weil ich nicht in wie weit mein Dozent das akzeptiert, dass ich hier nachfrage. Aber eigentlich sollte das kein Problem sein, deswegen poste ich jetz einfach mein Quelltext und werde den post am Anfang anpassen. Das ist am einfachsten.

Code:
    /* Datenstruktur für Artikel */
    struct artikel{
        int a_nr;            //Artikel Nummer
        char a_name;    //Artikel Name
        float a_price;     //Artikel Preis  
        int a_item;        //Anzahl der Artikel
        int a_min_item; //Mindestmenge
    };

struct artikel *compare(char line[][50], struct artikel *a_list){          
    char com[5][18]={"Artikelnummer", "Artikelname", "Preis pro Artikel", "Stueckzahl", "Mindestmenge"};         //Befehle    
    int i = 0;       //Zählervariable für äußere Schleife
    int j = 0;      //Zählervariable für innere Schleufe
    char *ptr;    //Pointervariable
    char *cat;
    char *value;
    float price;
    int int_var;
    
    ptr = strtok(line[0], ":");   //String wird beim zeichen ":" geteilt
    while(ptr != NULL) {                
        i++;
        if(i == 1){                                   
            cat = ptr;   //Artikelinformation (Artikelnummer etc.)
        }else if(i == 2){           
            value = ptr;   //Wert der Artikelinformationen
        }
    
        ptr = strtok(NULL, ":");             
    }

    for(j; j <= 4; j++){                                        
        if(strcmp(com[j], cat) == 0) { //Überprüft Artikelinformation mit den Kommandos                                   
             
            if(j == 0) {                                                       
                int_var = atoi(value); //Typumwandlung: string -> int
                a_list->a_nr = int_var;
            }else if(j == 1) {                                     
                a_list->a_name = value;         
            }else if(j == 2) {                                             
                price = atof(value); //Typumwandlung: string -> float
                a_list->a_price = price;
            }else if(j == 3) {                                    
                int_var = atoi(value);   //Typumwandlung: string -> int
                a_list->a_item = int_var;
                printf("%i", a_list->a_item);
            }else if(j == 4) {                          
                int_var = atoi(value);  //Typumwandlung: string -> int
                a_list->a_min_item = int_var;
            }         
        } 
        printf("%i", a_list->a_item);
        return a_list;          
    }   
    
}


/* Funktion zum einlesen der Daten */
int readAll(fileName) {  
        file = fopen(fileName, "r");  //Datei wird erneut geöffnet
        int lineNum = 0;    //Zeilennummer  
        char row[512];   //Zeilen

        while(!feof(file)) {   //Die Anzahl der Zeilen wird ermittelt
            fgets(row, 512, file);
            lineNum++;
        }    
        fclose(file); //Datei wird geschlossen
        file = fopen(fileName, "r");   //Datei wird erneut geöffnet
        struct artikel *a_list;
        for(i = 0; i < lineNum; i++) {          
            fgets(line[i], 50,file);  //Jede Zeiler der txt wird ausgelesen                                 
            compare(line[i], *a_list);  //Die funktion compare wird aufgerufen
        }  
        fclose(file);   //Datei wird geschlossen    

}

Und ja in der Datei können auch mehrere Artikel auftauchen...
 
Zuletzt bearbeitet:
Argh...ja sry. Hab ich ganz verdrängt ^^.

header Datei:
Code:
FILE *file;

// Name der Datei
char *fileName[];


char line[][10];

int i;

Frag mich nicht wieso dort int i deklariert ist. Habs bei mir gerade geändert ^^

main Datei:
Code:
readAll("artikel1.txt");
 
Du musst den Arrays Werte für die Speicherreservierung geben.

C++:
char *fileName[10];

So zum Beispiel. Dasselbe gilt natürlich auch für line.
Außerdem steht in Zeile 60 in der Parameterliste der Funktion nur fileName, jedoch kein Datentyp.

Lg
 

Neue Beiträge

Zurück