Dziwne znaki w zapisywanym pliku binarnym

0

Jako że to mój pierwszy post witam wszystkich serdecznie.

Mam pewien problem skończyłem właśnie pisać projekt z C na zaliczenie.
Wszystkie funkcje chodzą bardzo dobrze i ogólnie nie ma do czego się przyczepić ,jednak zastanawia mnie jeden fakt a mianowicie przy dodawaniu nowego elementu do listy jednokierunkowej i późniejszym jego zapisywaniu do pliku binarnego w tym właśnie pliku binarnym wyskakują dziwne "krzaczki" jednak tylko i wyłącznie w tym miejscu gdzie jest dodany nowy element.

Dodam tylko że w wczytując z pliku do programu krzaczki nie występują i wszystko ładnie sie wczytuje i wypisuje.Próbowałem zapisywać listę do pliku tekstowego i wtedy krzaczków również nie ma

Przykladowe krzaczki w pliku:

Kowalski n Pn °Şn ˙˙˙˙Pn 0 § § Jan äü( ţ( € ' $
n ŕ\ ţ( ‡ňMostowa ÉS $ u u$ ţ( )ňu
n Hţ( 857488978 uě
ÉS )u Au ţ( )u¸ţ( ŐŚBialystok ;u ŕý~ )udţ( B¤uXupţ( üńu Nigdy u )u€hu
ÉS ŕý~ „ţ( l
ÉSÄ˙

Funkcja zapisująca do pliku listę

void Zapisz (sLista*poczatek)
{
    FILE*f;
    if(!(f=fopen("plik.bin","wb")))
    {
        printf("Nie udalo sie otworzyc pliku.");
        exit(1);
    }
    sLista*wsk=poczatek;
    while(wsk!=NULL)
    {
        fwrite(&wsk->dane,sizeof(wsk->dane), 1, f);

        wsk=wsk->next;
    }
    fclose(f);
}

Funkcja dodająca nowy element:

void dodawanie (sLista*poczatek)
{
    sOsoba os;
    printf("Podaj dane osoby do dodania\n");
    printf("Nazwisko : ");
    scanf("%s",os.nazwisko);
    printf("\nImie : ");
    scanf("%s",os.imie);
    printf("\nUlica : ");
    scanf("%s",os.ulica);
    printf("\nNumer : ");
    scanf("%s",os.numer);
    printf("\nMiasto : ");
    scanf("%s",os.miasto);
    sLista*wsk=poczatek;
    sLista*nowy;
    while(wsk->next!=NULL)
    {
        wsk=wsk->next;
    }
    nowy=malloc(sizeof(sLista));
    nowy->dane=os;
    wsk->next = nowy;

}

Deklaracja struktury i listy :

typedef struct
{
    char nazwisko[50];
    char imie[50];
    char ulica[50];
    char numer[50];
    char miasto[50];
} sOsoba;
typedef struct listaosob
{
    sOsoba dane;
    struct listaosob *next;
} sLista;

Teoretycznie program działa wszystko wypisuje bez krzaczków jednak nurtuje mnie dlaczego te"krzaczki" pojawiają się tylko w pliku binarnym.

1

Zapisujesz całe 50 bajtów (bo tyle ma tablica) a zainicjowane jest tylko N początkowych, tyle ile wpisałeś z klawiatury plus znak NULL.

Jeśli ci to przeszkadza, to wyzeruj tablice albo alokuj pamięć przez calloc, które działa jak malloc ale zeruje pamięć.

0

Spróbowałem zrobić tak jak powiedziałeś i niestety przez callocka nie działa poprawnie, jednak zrobiłem to na bardzo bardzo prymitywny sposób który niestety mi się bardzo nie podoba aczkolwiek działa bardzo dobrze.

 for(i=0; i<50; i++)
    {
        os.nazwisko[i]='\0';
        os.imie[i]='\0';
        os.ulica[i]='\0';
        os.numer[i]='\0';
        os.miasto[i]='\0';
        os.modyfikacja[i]='\0';
    }

Może jakiś bardziej obeznany forumowicz ma pomysł jak zrobić to ładniej prościej a może nawet w jednej linijce ? :D

0
  1. Najlepsze to poprawne użycie calloc
  2. Trochę gorzej jeżeli nie starcza ID do przeczytania dokumentacji o calloc to memset(&os,0,sizeof(os));

1 użytkowników online, w tym zalogowanych: 0, gości: 1