Keresés

Hirdetés

Új hozzászólás Aktív témák

  • 0xmilan

    addikt

    Üdv, láncolt listába szeretnék beolvasni fájlból.
    Így néz ki a struktúra:
    typedef struct Kerdes{
    int szint;
    char *ker, *a, *b, *c, *d;
    char valasz;
    struct Kerdes *kov;
    } Kerdes;

    és a függvény:

    Kerdes* beolvas(Kerdes *lista){
    FILE *fp;
    Kerdes *uj;
    char c;
    uj=(Kerdes*) malloc(sizeof(Kerdes));
    lista=(Kerdes*) malloc(sizeof(Kerdes));
    char tempk[256], tempa[50], tempb[50], tempc[50], tempd[50];
    fp = fopen("loim.txt", "rt");
    if (fp == NULL) printf("Nem sikerült megnyitni!");
    else{
    while(!feof(fp)){
    fscanf(fp, "%d %s %s %s %s %s %c\n", &uj->szint, tempk, tempa, tempb, tempc, tempd, &uj->valasz);
    uj->ker=(char*) malloc(strlen(tempk)*sizeof(char));
    strcpy(lista->ker,tempk);
    uj->a=(char*) malloc(strlen(tempa)*sizeof(char));
    strcpy(lista->a,tempa);
    uj->b=(char*) malloc(strlen(tempb)*sizeof(char));
    strcpy(lista->b,tempb);
    uj->c=(char*) malloc(strlen(tempc)*sizeof(char));
    strcpy(lista->c,tempc);
    uj->d=(char*) malloc(strlen(tempd)*sizeof(char));
    strcpy(lista->d,tempd);
    uj->kov=lista;
    lista=uj;
    }
    }
    fclose(fp);
    return lista;
    }

    és így hívnám meg main-ben:
    Kerdes *lista=NULL;
    beolvas(lista);

    Hiba nélkül lefut, de amint elindul, le is fagy. Mi lehet a gond?
    (életem első fájlból olvasása lenne C-ben. korábban csináltam már C#-ban, de ott ugye nem kellett a dinamikus dolgokkal szórakozni. amúgy azt az infót kaptam, hogy ha így elszáll, akkor az pointerek miatt van, de fogalmam sincs hogy hol.)

    [ Szerkesztve ]

  • 0xmilan

    addikt

    válasz gygabor88 #4262 üzenetére

    Tényleg, köszi! Nem is a listaba, hanem az uj-ba kellett volna beolvasnom, meg strcpy-zni aztán onnan meg a lista=uj és akkor elvileg az elejére fűződik.

    átírtam az adott részt így:
    uj->ker=(char*) malloc((strlen(tempk)+1)*sizeof(char));
    lista->ker=(char*) malloc((strlen(tempk)+1)*sizeof(char));
    strcpy(uj->ker,tempk);
    uj->ker[strlen(tempk)+1]='\0';
    uj->a=(char*) malloc((strlen(tempa)+1)*sizeof(char));
    lista->a=(char*) malloc((strlen(tempk)+1)*sizeof(char));
    strcpy(uj->a,tempa);
    stb
    .
    .

    és akkor a végére mindig be kéne szúrni a \0-t így?:
    uj->ker[strlen(tempk)+1]='\0';

    Ha jól tudom azért kell NULL-lal hívni, mert akkor az lesz a vége és így tudom bejárni, hogy a nullpointer a kilépési feltétel.

    (ja amúgy ugyanúgy lefagy)

    [ Szerkesztve ]

  • 0xmilan

    addikt

    válasz gygabor88 #4264 üzenetére

    Ezer köszi segítséget!
    A túlindexelést egy levlistán olvastam, aztán bele se gondoltam, hogy hülyeség.
    ..Pont az a baj, hogy nem ismert a stringek hossza, és - bár megadhatnék egy max. hosszt - , a lényeg, hogy egy bájttal se használjak több memóriát, mint amennyi tényleg kell.

    Kösz a tippet a dubeggerre. Korábban már használtam, de elszoktam tőle, aztán megmutatta, hogy működik a beolvasás, csak nem úgy, ahogy én azt gondoltam.
    tempk-ba egy kérdést várnék (legyenönismilliomost írok), amiben ugye több szóköz van, én meg azt hittem, hogy majd kitalálja meddig tart a kérdés. :DDD Így utólag elég hülyének érzem magam.
    Szóval elkezdte szépen bepakolni a kérdés egyes szavait a válaszok sztringjeibe.
    Ezek szerint itt az fscanf nem is használható..? Mindenképpen karakterenként kéne beolvasni?

    Olyat tudok, hogy karaktert vizsgálni, azon belül meg stringet olvasni?
    pl így:

    while (fgetc(fp) != '9'){ - elvileg a TAB kódja
    fscanf(fp, "%s", &tempk);
    ...+ mindig hozzáfűzögetni az új szavakat;
    }

  • 0xmilan

    addikt

    válasz Jester01 #4266 üzenetére

    Köszi, azóta meglett a '\t'. Úgy néz ki karakterenkénti olvasás lesz belőle..

  • 0xmilan

    addikt

    válasz skylaner #4269 üzenetére

    Köszi, jogos.
    Megnéztem egy régebbi példát, és annak mintájára külön függvénnyel fűztem a lista elejére.
    Most így néz ki a működő verzió:
    ...
    while(!feof(fp)){
    fgets(temp, 256, fp);
    sscanf(temp, "%d %[^\t] %[^\t] %[^\t] %[^\t] %[^\t] %c", &szint, &tempk, &tempa, &tempb, &tempc, &tempd, &valasz);
    lista=elejere(lista, szint, tempk, tempa, tempb, tempc, tempd, valasz);
    }
    }

    ...
    Kerdes* elejere(Kerdes *lista, int szint, char* tempk, char* tempa, char* tempb, char* tempc, char* tempd, char valasz){
    Kerdes *uj;
    uj=(Kerdes*) malloc(sizeof(Kerdes));
    uj->szint=szint;
    uj->ker=(char*) malloc((strlen(tempk)+1)*sizeof(char));
    strcpy(uj->ker,tempk);
    uj->a=(char*) malloc((strlen(tempa)+1)*sizeof(char));
    strcpy(uj->a,tempa);
    uj->b=(char*) malloc((strlen(tempb)+1)*sizeof(char));
    strcpy(uj->b,tempb);
    uj->c=(char*) malloc((strlen(tempc)+1)*sizeof(char));
    strcpy(uj->c,tempc);
    uj->d=(char*) malloc((strlen(tempd)+1)*sizeof(char));
    strcpy(uj->d,tempd);
    uj->valasz=valasz;
    uj->kov=lista;
    return uj;
    }

    Most fgets-szel beolvasok egy sort, aztán sscanf-fel meg tabulátoronként darabolom és aztán rakom új listaelembe.
    A listának meg nem is kellett volna helyet foglalni, mert az csak egy pointer..
    Még egyszer kösz a segítséget mindenkinek!

Új hozzászólás Aktív témák