Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[c++] Problem z alokacją pamięci

robertos88 19 Oct 2009 17:07 980 3
  • #1
    robertos88
    Level 1  
    Witam
    mam problem z następującym zadaniem:

    Wczytać plik do pamieci po urzednim zaalokowaniu tylu bajtow ile ma plik. Posortować wszystkie znaki i zapisac wynik do nowego pliku, argumenty (nazwa pliku) podawanie z lini poleceń.

    czy mógłby ktoś podpowiedzieć jak zaalokować w pamięci taką ilość bajtów jaką ma plik ?
  • #3
    one_eddie
    Level 25  
    Możesz również przesunąć wskaźnik pliku na koniec fseek, następnie odczytać pozycje ftell. Oczywiście to podejście z C ale zadziała również dla C++.
  • #4
    FirstStep
    Level 12  
    Zapisanie do pliku oraz wczytanie z linii poleceń zrób sam ;-) Żeby nie było, że dostajesz gotowca...
    Code:

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

    using namespace std;

    //przeklejone sortowanie ze strony
    //http://www.java2s.com/Code/C/Data-Structure-Algorithm/TheQuicksort.htm

    void quickSort(char *items, int left, int right)
    {
      int i, j;
      char x, y;

      i = left;
      j = right;
      x = items[(left+right)/2];

      do {
        while((items[i] < x) && (i < right))
           i++;
        while((x < items[j]) && (j > left))
           j--;

        if(i <= j) {
          y = items[i];
          items[i] = items[j];
          items[j] = y;
          i++; j--;
        }
      } while(i <= j);

      if(i < right)
          quickSort(items, i, right);
      if(left < j)
          quickSort(items, left, j);

    }


    void quickSortMain(char *items, int count)
    {
      quickSort(items, 0, count-1);
    }




    int main()
    {
        //Zapisanie tekstu do pliku tren.txt
        FILE *fp;
        char tekst[] = "filefilefile";

        if((fp=fopen("C:\\tren.txt","w"))==NULL)
        {
            printf("Nie moge otworzyc pliku!.");
            exit(1);
        }

        fprintf(fp, "%s", tekst);
        fclose(fp);



        //Rozmiar pliku
        fp=NULL;
        fpos_t dlugosc;
        if((fp=fopen("C:\\tren.txt","rb"))==NULL)
        {
            printf("Blad otwarcia pliku.");
            exit(1);
        }
        fseek(fp,0,SEEK_END);
        fgetpos( fp, &dlugosc );
        fseek(fp,0,SEEK_SET);
        printf("Rozmiar pliku: %d bajtow.\n",dlugosc);
        fclose(fp);

        //Wczytanie znakow z pliku tren.txt do tablicy dynamicznej.

        char *bufor = (char *)malloc(dlugosc * sizeof(char));
        fp = NULL;
        int znak;

        if((fp=fopen("C:\\tren.txt","r"))==NULL)
        {
            printf("Blad otwarcia pliku.");
            exit(1);
        }
        int licznik=0;
        do
        {
            znak=fgetc(fp);
            bufor[licznik]=(char)znak;
            ++licznik;

        }while(znak!=EOF);

        //Mamy juz w buforze znaki, trzeba je posortować - quicksort

        cout<<"\nPrzed sortowaniem: \n";
        for(int z=0; z<dlugosc; z++)
            cout<<bufor[z];

        quickSortMain(bufor, dlugosc);

        cout<<"\nPo sortowaniu: \n";
        for(int z=0; z<dlugosc; z++)
            cout<<bufor[z];



        fclose(fp);
        free(bufor);
        return 0;
    }


    Piwo...