Wypełnianie tabeli danymi z pliku.

0

Witam, treść polecenia brzmi następująco:

Napisz program, który wypełni tablicę wartościami odczytanymi z pliku tekstowego dane.txt. Plik tekstowy zawiera jedną kolumnę i dowolną ilość wierszy. Policz wiersze korzystając z funkcji feof i zaalokuj odpowiednią tablicę. Wypisz tablicę na ekran. Korzystając z funkcji realloc zmień rozmiar tablicy o wartość podaną przez użytkownika. Jeżeli użytkownik zdecydował się zwiększyć rozmiar tablicy to do nowych komórek wpisz wartości pseudolosowe z przedziału od 5 do 6. Jeszcze raz wypisz tablicę na ekran.

Polcenie wykonałem, kod napisałem. Dane ładnie wczytuje z pliku, wyrzuca je na ekran, liczy ile ich jest, natomiast problem się pojawia gdy wypełnia tablicę tymi odczytanymi danymi. Tablica zawiera kompletne bzdury. Z resztą jeśli ktoś ma ochote pomóc to polecam samemu sobie skompilować i zobaczyć co się dzieje. Aby program się kompilował, zróbcie sobie plik tekstowy dane.txt w którym jest jedna kolumna osiemnastu liczb całkowitych, wpiszcie sobie jakie chcecie. Załączam kod.

#include<stdio.h>
#include<string.h>
#include<math.h>
#include <stdlib.h>
#include <time.h>

void wczytaj()
{
   FILE *plik;
   int liczba,licznik=0;
   int* tab;
   int i=0;
   int wiersz;

   plik = fopen("dane.txt","r");    //otwieramy plik tutaj
   if (plik == NULL) // sprawdzamy czy plik nie jest pusty
   {
      printf("Blad otwarcia pliku \"dane.txt\"\n");

   }

   while(feof(plik) == 0) // wykonuj pêtle dopóki plik nie jest pusty. feof Zwraca wartoœæ ró¿n¹ od zera gdy zosta³ osi¹gniêty koniec pliku
   {
      fscanf(plik,"%d",&liczba); //wczytujemy i wyswietlamy na ekran zawartosc pliku
      licznik++;
      printf("%d\n",liczba);

   }
   printf("licznik %d",licznik);
   tab = (int*)malloc(licznik*sizeof(int));

/* to jest niepotrzebne
   while(feof(plik) == 0)
   {
        fscanf(plik,"%d",&liczba);
       tab[i]=liczba;
        printf("%d",tab[i]);
        i++;
   }*/

    printf("\n");
    for(int j=0;j < licznik; j++)
    {
        fscanf(plik,"%d",&wiersz);
        tab[j] = wiersz;
        printf("%d \n",tab[j]);
    }

    printf("\n");
    int licznik1;
    printf("podaj nowy zakres tablicy");
    printf("\n");
    scanf("%d",&licznik1);
    tab=(int*)realloc(tab, licznik1*sizeof(int));

    for(int u=licznik ; u < licznik1 ; u++)
    {
       tab[u] = rand()%5+6;
    }

    for(int q=0; q < licznik+licznik1 ; q++)
    {
        printf("\n %d",tab[q]);
    }

   fclose(plik);
}

int main()
{

    wczytaj();
    return 0;
}
1
  1. nie cofnales wskaznika pliku na poczatek (fseek?)
  2. nie przepisales zawartosci starej tablicy do nowej
0

EDIT: Poprawiłem jednak wszystko, działa, bardzo dziekuje za pomoc i wklejam kod pro forma.

 #include<stdio.h>
#include<string.h>
#include<math.h>
#include <stdlib.h>
#include <time.h>

void wczytaj()
{
   FILE *plik;
   int liczba,licznik=0;
   int* tab;
   int i=0;
   int wiersz;
   int wiersz1;

   plik = fopen("dane.txt","r");    //otwieramy plik tutaj
   if (plik == NULL) // sprawdzamy czy plik nie jest pusty
   {
      printf("Blad otwarcia pliku \"dane.txt\"\n");

   }

   while(feof(plik) == 0) // wykonuj pêtle dopóki plik nie jest pusty. feof Zwraca wartoœæ ró¿n¹ od zera gdy zosta³ osi¹gniêty koniec pliku
   {
      fscanf(plik,"%d",&liczba); //wczytujemy i wyswietlamy na ekran zawartosc pliku
      licznik++;
      printf("%d\n",liczba);

   }

    printf("\n");
    printf("licznik %d",licznik);
    printf("\n");
    printf("\n");
    printf("Tablica wypelniona danymi z pliku");

    tab = (int*)malloc(licznik*sizeof(int)); // lokujemy pamiec

    rewind( plik ); // ustawiam wskaznik na poczatku tekstu

    printf("\n");

    for(int j=0;j < licznik; j++)
    {
        fscanf(plik,"%d",&wiersz);
        tab[j] = wiersz;
        printf("%d \n",tab[j]);
    }

    printf("\n");
    int licznik1;
    printf("o ile chcesz zwiekszyc zakres tablicy");
    printf("\n");
    scanf("%d",&licznik1);
    tab=(int*)realloc(tab, (licznik1+licznik)*sizeof(int));

    srand(time(NULL));

    for(int u=0 ; u < licznik+licznik1+1 ; u++) // wypelniam tablice, pierwsze 18 elementow to te z pliku dane.txt a te dodatkowe o ktore powiekszylismy tablice to rand5+6
    {
        if(u<licznik)
        {
            fscanf(plik,"%d",&wiersz1);
            wiersz1 = tab[u];
            printf("%d \n",tab[u]);
        }
        else if (u>licznik)
        {

           tab[u]= rand()%2+5;
           printf("%d \n",tab[u]);

        }

    }

    fclose(plik);
}

int main()
{
    wczytaj();
    return 0;
}

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