Zapisywanie i odczytywanie z pliku

0

Problem mój polega na tym, że po odczycie danej listy z pliku tekstowego powinna ona się zapisać jako "główna lista". Odczyt przebiega dobrze, ale już te nadpisanie listy nie działa poprawnie. Próbowałem rzutowania, zmieniania typów, ale to nic nie daje. Wygląda też, jakby program zapisywał te dane odczytane jako znaki ASCII. Jeżeli ktoś będzie miał ochotę i czas, aby spojrzeć na ten program, to dziękuję bardzo.

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

typedef struct element {
    int val;
    struct element *next;
} el_listy;

el_listy *first;

void add_to_list(el_listy *lista, int liczba)
{
    el_listy *wsk = lista, *nowy;
    while (wsk->next != NULL)
    {
        wsk = wsk->next;
    }
    nowy = (el_listy *) malloc (sizeof(el_listy));
    nowy->val = liczba;
    nowy->next = NULL;
    wsk->next = nowy;
}

int prime_number(el_listy *lista, int liczba)
{
    el_listy *wsk = first;
    while (wsk != NULL)
    {
        if ((liczba%wsk->val)==0) return 0;
        wsk = wsk->next;
    }
    return 1;
}

void wri_out(el_listy *lista)
{
    el_listy *wsk = lista;
    while (wsk!=NULL)
    {
        printf("\n%d", wsk->val);
        wsk=wsk->next;
    }
}

void add_to_end(el_listy *lista, int number)
{
    el_listy *end;
    while (lista->next!=NULL)
    {
        lista = lista->next;
    }
    end = (el_listy *) malloc (sizeof(el_listy));
    end->val = number;
    end->next = NULL;
    lista->next = end;
}

void remove_e(el_listy *lista, int number)
{
    int n = 0;
    el_listy *subse;
    el_listy *prev;
    while(lista->val!=number)
    {
        prev = lista;
        lista = lista->next;
        n++;
    }
    if (n==0)
    {
       lista = lista->next;
    } else {
        subse = lista->next;
        prev->next = subse;
        free(lista);
    }
}

void del_the_list(el_listy *lista)
{
    el_listy *prev = lista;
    while (lista->next!=NULL)
    {
        prev = lista;
        lista = lista->next;
        prev->next = NULL;
    }
    lista = NULL;
}

void wri_to_file(el_listy *lista)
{
    FILE *plik;
    plik = fopen("zapis.txt", "w");

    if(plik!=NULL)
    {
       for(;lista!=NULL;)
       {
           fprintf (plik, "%d\n", lista->val);
           lista = lista->next;
       }
    fclose(plik);
    }

}

void read_from_file(el_listy *lista)
{
    FILE * plik;
    int i;
    el_listy *wsk = lista;
    long lSize;
    char *blok;
    size_t result;

    plik = fopen ( "odczyt.txt" , "rb" );
    if (plik==NULL) {fputs ("File error",stderr); exit (1);}

  // uzyskanie wielkości pliku:
    fseek (plik , 0 , SEEK_END);
    lSize = ftell (plik);
    rewind (plik);

  // alokacja pamięci dla całego pliku:
    blok = (char*) malloc (sizeof(char)*lSize);
    if (blok == NULL) {fputs ("Memory error",stderr); exit (2);}

  // wczytanie pliku do bloku pamięci:
    result = fread (blok,sizeof(char),lSize,plik);
    if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
    el_listy  *nowy;
  /* plik jest teraz w pamięci, można odwoływać się do niego jak do tablicy. */
    for (i=0; i<lSize; i++)
    {
        printf("%c", blok[i]);
        while (wsk->next != NULL)
        {
            wsk = wsk->next;
        }
    nowy = (el_listy *) malloc (sizeof(el_listy));
    nowy->val = blok[i];
    nowy->next = NULL;
    wsk->next = nowy;

    }
    printf("\n");
    fclose (plik);
    free (blok);
}

void create_prime(el_listy *lista)
{
    const int END = 100;
    int i=3;
    for (;i!=END;++i)
    {
        if (prime_number(first, i))
        {
           add_to_list(first, i);
        }
    }
}

int main()
{
    int choice, dig,el;
    char c;
    first = (el_listy *) malloc (sizeof(el_listy));
    first->val = 2;
    first->next = NULL;

    do {
    printf("\nMenu:");
    printf("\n0. Utworz liste liczb pierwszych do 100, wybierz 0.");
    printf("\n1. Kasowanie listy, wybierz 1.");
    printf("\n2. Dodawanie elementu na koniec listy, wybierz 2.");
    printf("\n3. Usuwanie elementu o podanej wartosci (liczby pierwsze do 100), wybierz 3.");
    printf("\n4. Wypisywanie listy, wybierz 4.");
    printf("\n5. Zapisanie listy do pliku, wybierz 5.");
    printf("\n6. Odczyt listy z pliku i zapisanie jej jako wlasciwa liste, wybierz 6.");

    printf("\nCo chcesz zrobic?");
    scanf("%d", &choice);

    switch (choice)
    {
        {
            case 0:
            create_prime(first);
            break;
        }
        {
            case 1:
            printf("\n");
            del_the_list(first);
            wri_out(first);
            break;
        }
        {
            case 2:
            printf("\n");
            printf("\nJaka liczbe dodac na koniec listy: ");
            scanf("%d", &dig);
            add_to_end(first, dig);
            printf("\n");
            wri_out(first);
            break;
        }
        {
            case 3:
            printf("\n");
            printf("\nElement do usuniecia: ");
            scanf("%d", &el);
            remove_e(first,el);
            printf("\n");
            wri_out(first);
            break;
        }
        {
            case 4:
            wri_out(first);
            break;
        }
        {
            case 5:
            wri_to_file(first);
            break;
        }
        {
            case 6:
            del_the_list(first);
            read_from_file(first);
            break;
        }

    }
    printf("\nKontynuowac?(T/N)");
    getchar();
    c = getchar();
    } while ((choice==1 || choice==2 || choice==3 || choice==4 || choice==5 || choice==6 || choice==0) && (c=='t' || c=='T'));


    getch();
    free(first);
    return 0;
}

0

Jeżeli ktoś tu zajrzy, to zamieszczam część kodu, którą poprawiłem i dzięki temu program działa jak należy.

void read_from_file(el_listy *lista)
{
   FILE *plik = fopen("odczyt.txt", "r");
   int l;

   while ( !feof(plik) )
   {
       fscanf(plik, "%d", &l);
       add_to_list(lista,l);
   };
   fclose(plik);
}

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