[c] wczytywanie z pliku - zjadany znak

0

po raz kolejny zawraca głowę, no ale... podczas wczytywania/wypisywania pomija mi pierwszy znak każdego wiersza. myślałem, że pominę to przez zapisywanie do pliku z jakimś znakiem na początku i to się dotychczas sprawdzało, ale teraz problem wraca...

oto funkcje:

typedef struct test_t{
    char *lancuch;
    int liczba;
    struct test_t* nast;
}test_t;

void wypisz(test_t* glowny)
{
    while(glowny != NULL)
    {
        printf("%d.%s", glowny->liczba, glowny->lancuch);
        glowny = glowny->nast;
    }
}

test_t* czytaj(FILE* plik, test_t* glowny)
{
    test_t *poprzedni, *biezacy;
    char znak;
    int i=0;
    
    while((znak=getc(plik)) != EOF)
    {
        biezacy = (test_t*)malloc(sizeof(test_t));
        if (biezacy==NULL)
        {
            perror("malloc");
            exit (EXIT_FAILURE);
        }
        biezacy->lancuch=(char*)malloc(100*sizeof(char));
        if (biezacy->lancuch==NULL)
        {
            perror("malloc");
            exit (EXIT_FAILURE);
        }
    
        if (glowny == NULL)
            glowny = biezacy;
        else
            poprzedni->nast = biezacy;
            
        biezacy->nast = NULL;
    
        fgets(biezacy->lancuch, 100, plik);
        i++;
        biezacy->liczba=i;
        poprzedni = biezacy;
    }
    
    if(glowny != NULL)
        biezacy->lancuch=strcat(biezacy->lancuch, "\n");
        
    return glowny;
}

int main(int argc, char** argv)
{
    FILE* plik;
    test_t* glowny=NULL;

            if(plik=fopen(argv[1],"r"))
            {
                glowny=czytaj(plik, glowny);
                wypisz(glowny);
                fclose(plik);
            }
            else
            {
                printf("Podany plik nie istnieje");
                return 1;
            }
    return 0;
}
0

Na szybko:
while((znak=getc(plik)) != EOF)
to powoduje pobranie pierwszego znaku z pliku i to zapewne jest znak który zgubiłeś...
Rozwiązanie (powinno zadziałać)

fgets(biezacy->lancuch, 100, plik);
sprintf(biezacy->lancuch,"%c%s",znak,biezacy->lancuch);
i++;
biezacy->liczba=i;
poprzedni = biezacy;
0

blisko, tylko że wypełnia mi cały łańcuch tym znakiem ;-)

0

Aj mea culpa, musisz więcej zaalokować żeby to char się zmieściło

 while((znak=getc(plik)) != EOF)
    {
        biezacy->lancuch=(char*)malloc(101*sizeof(char)); //101 bo 100 + ostatni na tego chara :P
//
        fgets(biezacy->lancuch, 100, plik);
        sprintf(biezacy->lancuch,"%c%s",znak,biezacy->lancuch);
        i++;
        biezacy->liczba=i;
        poprzedni = biezacy;
    }
0

dzięki wielkie ;)
obszedłem to teraz zmieniając warunek końca pliku na:
feof( plik) == 0

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.