Brauche Hilfe bei Struct



  • Also ich hab jetzt einfach mal das ganze so geschrieben, dass ich davon ausgehe, dass nur der Text einer Textdatei in ein Feld eingelesen werden soll. Was es trotzdem mit dem Ausdruck "ArtikelTyp* Artikel[100]" auf sich hat, bleibt mir trotzdem fraglich.
    Danke nochmal für die schnellen Antworten.

    int main(){

    FILE* Textdatei;
    char Artikel[100];
    int i=0;
    char s=NULL;

    Textdatei = fopen("C:\\liste.txt" , "r");

    if(Textdatei==NULL)printf("Datei wurde nicht gefunden.");

    for(i=0;s!=EOF || i<99;i++)
    {
    s=fgetc(Textdatei);
    Artikel[i]=s;

    }
    fclose(Textdatei);
    Artikel[i]='\0';

    printf("%s", Artikel);

    getch();
    return 0;
    }



  • pAiSTe schrieb:

    Was es trotzdem mit dem Ausdruck "ArtikelTyp* Artikel[100]" auf sich hat, bleibt mir trotzdem fraglich.

    Es ist ein Array mit 100 Elementen vom Typ 'Zeiger auf ArtikelTyp'. Um das so zu benutzen musst du, wie gesagt, für jedes dieser Elemente Speicher allozieren, was unnötig ist.

    Warum du die Struktur jetzt weggelassen hast und alles in einem String schreibst, ist mir schleierhaft. Die Struktur ist bzw. war doch eine gute Lösung, oder nicht?!



  • Hm joa okay...wie würde man dann den Speicher dafür allozieren? Mit (ArtikelTyp*)malloc(sizeof(ArtikelTyp))?



  • Gleich sagt wieder jemand, daß man malloc nicht casten soll.



  • for (i = 0; i < 100; i++) {
        Artikel[i] = malloc (sizeof (*Artikel));
    }
    

    Und um auf die Variablen der Struktur zugreifen zu können:

    Artikel[3][0].preis
    Artikel[3][0].bezeichnung
    

    Der zweite Index muss hier immer 0 sein.



  • Also jetzt kommt immer:

    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    #include <ctype.h>

    struct Schreibwaren{
    float preis;
    char bezeichnung[100];
    char eigenschaft[100];
    }ArtikelTyp;

    int main(){

    FILE* Textdatei;
    ArtikelTyp* Artikel[100];
    int i=0;
    char s=NULL;

    for (i = 0; i < 100; i++) {
    Artikel[i] = malloc (sizeof (*Artikel));
    }

    Textdatei = fopen("C:\\liste.txt" , "r");

    if(Textdatei==NULL)printf("Datei wurde nicht gefunden.");

    for(i=0;s!=EOF || i<99;i++)
    {
    s=fgetc(Textdatei);
    Artikel[i]=s;
    printf("%c", Artikel[i]);
    }
    fclose(Textdatei);
    Artikel[i]='\0';

    getch();
    return 0;
    }

    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2070: ''unknown-type'': Ungültiger sizeof-Operand
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner
    : error C2065: 'Artikel': nichtdeklarierter Bezeichner



  • Es fehlt der zweite Index bei Artikel.



  • Hm, also man soll ja den kompletten Text in ein Feld einlesen.
    Für was steht jetzt der 2. Index?
    Müsste man dann das so schreiben?:
    Artikel[i][0]=s;



  • Nimm fscanf zum Einlesen:

    fscanf (Textdatei, "%f %100s %100s", &Artikel[i][0].preis, Artikel[i][0].bezeichnung, Artikel[i][0].eigenschaft);
    

    pAiSTe schrieb:

    Für was steht jetzt der 2. Index?

    Der steht für das (unnötig) allozierte Element.



  • hellseher schrieb:

    Gleich sagt wieder jemand, daß man malloc nicht casten soll.

    Nee, ich werd' einfach nur blind ohne c/c++- Tags.

    Achje, das war jetzt nicht so wirklich konstruktiv 😞



  • Hm nagut ich werde nochmal über alles drüberschaun und nachdenken...dann hab ich nochmal ne kurze aufgabe aber bin mir da nicht so sicher...wie legt man da den Typ fest?
    Und zwar:
    Welchen Wert und welchen Typ haben folgende Ausdrücke?
    a) 19/4.0
    b) 19/5
    c) 62L
    d)(double)(5/3)
    e) (float) 4/3
    f) 1,14
    g) 12/5+3.2
    h) -128
    i) (char) 65/'A'
    J)32UL



  • Welchen Wert und welchen Typ haben folgende Ausdrücke?

    Wenn du castest oder Präfix-Literale verwendest, immer den gewünschten. Sonst den "einfachsten", der den Wert aufnehmen kann.



  • mit "einfachsten" meinst du Priorität oder Bytes?


Anmelden zum Antworten