Wczytywanie/uzywanie pliku ponownie

Wczytywanie/uzywanie pliku ponownie
LA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 60
0

Witam, mam problem otóż mam plik.txt który będzie jakąś dynamiczną bazą nie wiadomo ile rekordów w tej bazie będą ciągi znaków nie dłuższe niż 100 znaków. Chce napisać taki skrypt który dynamicznie utworzy tablice stringów i posortuje je np buble sortem. Problem polega na tym ze jak najpierw zlicze ilość wierszy to następnie przy wczytywaniu z pliku podejrzewam ze wczytuje mi śmieci gdyż moja pelta dojedzie do końca pliku. Może bardziej widoczne będzie to na kodzie:

Kopiuj
 
//wywołać np ./program baza.txt
#include <stdio.h>
int main(int argc, char *argv[])
{
   FILE *plik;
   char znak;
 
   if((plik = fopen(*++argv, "r")) == NULL)
   {
      printf("nie mogę otworzyć pliku %s\n", *argv);
      return 1;
   }
  
   //Zliczanie wierszy
   int wiersz = 0;
   while((znak = getc(plik)) != EOF)
   {
      if(znak == '\n')
         ++wiersz;
   }
   printf("Plik zawiera %d wiersze\n", wiersz+1);  //do tego miejsca ładnie mi wszystko chodzi
  
   //Wczytywanie
   char tablica[wiersz+1][100];
   int i=0;
    while((znak = getc(plik)) != EOF)     // podejrzewam ze tu jest błąd gdyż w poprzedniej pętli doszliśmy do końca pliku
   {
     fscanf(plik, "%s", tablica[i]);      //Gdy tą peltę wrzucę nad zliczanie wierszy i sam zadeklaruje tablice to ładnie wczyta 
         ++i;
   }
   
   //Wyświetlenie 
   for(i=0;i<wiersz+1;i++)
  {
    printf("%s\n",tablica[i]);
  }

return 0;
} 

Jak ten problem rozwiązać? Może istnieje jakiś fajny sposób na rezerwowanie tablicy?

Pozdrawiam

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
#include <stdio.h>

int main(int argc,char *argv[])
  {
   FILE *plik;
   long i,size,row;
   char *data,**rows;

   if(!(plik=fopen(argv[1],"r")))
     {
      printf("nie mogę otworzyć pliku %s\n",argv[1]);
      return 1;
     }
   fseek(plik,0,SEEK_END);
   size=ftell(plik);
   fseek(plik,0,SEEK_SET);
   data=(char*)malloc(size+1);
   size=fread(data,1,size,plik);
   if(!size)
     {
      printf("pusty plik\n");
      return 2;
     }
   data[size]=0;
   for(i=row=0;i<size;++i) if(data[i]=='\n') ++row;
   if(data[size-1]!='\n') ++row;
   rows=(char**)malloc(sizeof(char*)*row);
   for(i=row=0;i<size;++i) if(data[i]=='\n') ++row;
   rows[0]=data;
   for(i=row=0;i<size;++i)
     {
      if(data[i]=='\n')
        {
         data[i]=0;
         rows[++row]=data+i+1;
        }
     }
   for(i=0;i<row;++i)
     {
      printf("%3d: %s\n",i+1,rows[i]);
     }
   free(rows);
   free(data);
   return 0;
  }
LA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 60
0

Dzięki za opowiedz, nie chce robić tego metodą kopiuj-wklej bo się niczego nie naucze, Sam napisze cos podobnego z użyciem malloc i powiadomię was o wynikach bądz problemach.

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.