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

  • Rickazoid

    addikt

    Üdv!

    Akadt némi problémám egy programommal. Gyakorlatilag kész vagyok vele, látszólag pont úgy működik, ahogy kell, azonban a tesztelés közben belefutottam egy jókora problémába. Bizonyos helyzetekben a fájlból beolvasott számokat lenullázza. Beolvassa jól a számot, mint karaktert, de a számmá alakításnál 0 kerül a változókba. Látszólag számtól független, bármi lehet ott, rendesen átalakítja, amíg csak pár sor van. De ha ismétlődnek a sorok, akkor akármennyit átalakít, ahogy kell. Ha ugyanannyi van, mintha ismétlődne, de más a tartalom, akkor is jól működik. De ha az eredeti tesztfájlba csak még egy sort beírok, máris rossz lesz. Illetve akkor is rossz lesz, ha bizonyos sorokat meghosszabbítok. Magyarul számtalanszor előidéztem a hibát, de abszolút semmi fogalmam nincs róla, hogy mi lehet a gond.

    A kérdéses része a programomnak a következő:

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


    #define MAXID 100
    #define MAXLEN 20

    #define OUTF "AdatbazisTeszt3.ctlg"

    void printFile2Mem()
    {
    long size;
    rows=0;
    I=0;
    //az OUTF által hivatkozott fájl létrehozása, ha nem létezne
    FILE *f;
    f=fopen(OUTF, "a");
    fclose(f);
    //a fájl megnyitása olvasásra
    FILE *ff;
    ff = fopen(OUTF, "rt");
    fseek(ff, 0, SEEK_END); //a fájl végének megkeresése
    size = ftell(ff); //a file pointer beolvasása, megadja a fájl méretét
    fseek(ff, 0, SEEK_SET); //vissza a fájl elejére
    //printf("%d\n",size);
    //a buffer tömbök átmeneti tárolóként funkcionálnak majd a fájlból beolvasandó adatoknak
    char buffer[size+1],buffer2[size+1],buffer3[size],buffer4,c;
    //a teljes fájl beolvasása a buffer[] tömbbe
    fread(buffer, 1, size, f);
    buffer[size]=0;
    //fclose(f);
    //printf("The file:\n%s\n", buffer);
    //segédváltozók a ciklusokhoz, amik a buffer[] tömbből olvassák ki az adatokat és teszik a megfelelő átmeneti tárolóba
    int i=0,j=0,k=0,l=0,ii;

    fseek(ff, 0, SEEK_SET); //ismét a fájl elejére állítja a mutatót
    //beolvassa a rows globális változóba a sorok számát
    while((c=fgetc(f))!=EOF)
    if(c=='\n')rows++;
    //a fájl bezárása
    fclose(ff);

    printf("%d\n",rows);
    printf("The file:\n");
    //a buffer[] tömb elemeinek megfelelő tömbökbe helyezése

    for(ii=0;ii<rows;ii++)
    {
    j=0;
    while(buffer2[l++]!=EOF)buffer2[l-1]='\0';l=0; //enélkül hibák keletkeznek a különböző hosszúságú értékek ugyanazon tömbbe tárolásakor
    //a buffer2[] tömbbe beolvassa az aktuális sor ID-jét
    //egyelőre szövegként kezeli
    while(buffer[i++]!=';')
    if(buffer[i-1]>='0'&&buffer[i-1]<='9')
    buffer2[j++]=buffer[i-1];
    printf("buffer: %s\n",buffer2);
    j=0;
    while(buffer3[l++]!=EOF)buffer3[l-1]='\0';l=0; //enélkül hibák keletkeznek a különböző hosszúságú értékek ugyanazon tömbbe tárolásakor
    //a buffer[3] tömbbe beolvassa az aktuális sor nevét
    while(buffer[i++]!=';')buffer3[j++]=buffer[i-1];
    //printf("buffer: %s\n",buffer3);
    //buffer4='\0'; //bár a buffer4 csak egy karakteres változó, biztosítékként bekerült ez az értékadás a buffer[] tömbből való értékadás elé
    //eltárolja a buffer4 változóba az aktuális sor típusát
    buffer4=buffer[i];
    //az ID[] tömbb adott helyére eltárolja a buffer2-ben tárolt stringet integerként
    printf("buffer: %s\n",buffer2);
    ID[I]=atoi(buffer2);
    printf("ID: %d\n",ID[I]);
    //a Name[][] tömb adott helyeire eltárolja a buffer[] tömb elemeit
    while(Name[I][l]=buffer3[l++]);l=0;
    //a Tpy[] tömb adott helyére eltárolja a buffer4 értékét
    Tpy[I++]=buffer4;
    //kezdetlegesen formázott kiírása az adatbázis elemeinek
    //printf("%d\t%s\t%c\n", ID[ii],Name[ii],Tpy[ii]);
    }
    }

    Namost sejtem, hogy nem valami szép (és a tömbök méretei sincsenek egyelőre pontosan beállítva), de ennél jobbat egyelőre nem tudok írni. A hiba valahol a vége felé lehet, kiírattam a buffer2 változó értékét két helyen is, amikor az ID-tömbbe 0-kat rak, akkor a második kiíratásnál üres. Valamiért a kettő közt történik vele valahogy valami, viszont nem értem hogy, hisz nem nyúl hozzá semmi.

    Egy példafájl:
    ID;Name;Type
    1;egyes;C
    2;kettes;C
    945;kilencszáznegyvenönégyes;C
    4;négyes;C
    5;ötös;C

    Ezzel működik. De például ezzel már nem:
    ID;Name;Type
    1;egyes;C
    2;kettes;C
    945;kilencszáznegyvenönégyes;C
    4;négyes;C
    5;ötös;C
    6;hatos;C

    Ezzel sem:
    ID;Name;Type
    1;egyes;C
    2;kettes;C
    945;kilencszáznegyvenönégyes;C
    4;négyes;C
    512;ötszáztizenkettő;C

    Ezzel viszont igen:
    ID;Name;Type
    1;egyes;C
    2;kettes;C
    945;kilencszáznegyvenönégyes;C
    4;négyes;C
    512;ötszáz;C

    Ez utóbbinál ha megnövelem egy nem ékezetes karakterrel az utolsó sort, akkor még működik, de nagyobb növelést nem visel el. Amikor ezt észrevettem, azt hittem valami bájt korlátba ütköztem, de nem, ha a címsor alatti sorokat lemásolom és újra beillesztem, akkor is jól működik. Sőt ha egyenként átírom az ID-ket és össze-vissza írok karaktereket a nevekbe, hogy ne legyen ismétlődés, még akkor is működik. Sőt ha azt kibővítem egy akármilyen sorral (13.), az is működik. De ha még egy sort hozzáadok (14.), -1 hibakóddal kilép. De ha törlöm és beírok 13 sort, azonos karakterszámmal, csak más tartalommal, akkor működik. De ha azt bővítem ki egy sorral, megint jön a -1 hibakód. Ha lecsökkentem a nevek hosszát majd úgy írok be 14 sort, akkor nem kapok hibakódot, de 0-k lesznek az ID tömbben.
    Nem vagyok képes felismerni a rendszert a hibákban, mintha több dolog is hibát váltana ki, de képtelen vagyok rájönni, hogy miért.
    Ötletek?

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