Quantcast
Viewing all articles
Browse latest Browse all 21942

Błędne wyświetlenie znaków odczytanych z pliku.

Hej, to znowu ja. Przepraszam, że zarzucam forum pytaniami, ale muszę zaliczyć laboratoria. Kod z mojego poprzedniego pytania, musiałem zmodyfikować tak, aby pamięć była alokowana dynamicznie. Problem pojawia się w momencie zapisania znaków do pliku lub wyświetlenia ich na ekran, ponieważ zamiast oczekiwanych symboli pojawiają się losowe cyfry lub litery. Prosiłbym o jakąś wskazówkę lub wytłumaczenie.

#include <stdio.h>
#include <malloc.h>

int main(int argc, char*argv[])
{
    FILE *odczyt;
    FILE *zapis;

    if(argc<2)
    {
        printf("Za mala liczba argumentow.\nWprowadz dane w podany sposob %s plik_do_odczytu.txt plik_do_zapisu.txt",argv[0]);
        exit(1);
    }

    odczyt = fopen (argv[1], "r");
    if (odczyt==NULL)
     {
       printf ("Nie mogzna otworzyc pliku %s do odczytu lub nie podano nazwy pliku!\n",argv[1]);
       exit(1);
     }

    zapis = fopen (argv[2], "w");
    if (zapis==NULL)
     {
       printf ("Nie mogzna otworzyc pliku %s do zapisu lub nie podano nazwy pliku!\n",argv[2]);
       exit(1);
     }


    int rozmiar= 10240;
    char *tab = malloc(sizeof *tab * rozmiar);
    char *pomoc = malloc(sizeof *pomoc * rozmiar);
    int dlugosc=(sizeof *pomoc * rozmiar);
    printf ("1dlugosc= %d \n",dlugosc);

 /* Scalanie dwoch posortowanych ciagow
tab[pocz...sr] i tab[sr+1...kon] i
wynik zapisuje w tab[pocz...kon] */
void scalanie(int pocz, int sr, int kon)
{
    int i,j,q;

    for (i=pocz; i<=kon; i++)
      {
        pomoc[i]=tab[i];   // Skopiowanie danych do tablicy pomocniczej
      }

    i=pocz;
    j=sr+1;
    q=pocz;
                // Ustawienie wskaźników tablic
    while (i<=sr && j<=kon)
        {                    // Przenoszenie danych z sortowaniem ze zbiorów pomocniczych do tablicy głównej
          if (pomoc[i]<pomoc[j])
           {
             tab[q++]=pomoc[i++];
           }
          else
           {
              tab[q++]=pomoc[j++];
           }
        }

    while (i<=sr)
        {
          tab[q++]=pomoc[i++];
        }
                      // Przeniesienie nie skopiowanych danych ze zbioru pierwszego w przypadku, gdy drugi zbiór się skończył
}

/* Procedura sortowania tab[pocz...kon] */
void sortowanie(int pocz, int kon)
{
    int sr;

    if (pocz<kon)
     {
       sr=(pocz+kon)/2;
       sortowanie(pocz, sr);    // Dzielenie lewej części
       sortowanie(sr+1, kon);   // Dzielenie prawej części
       scalanie(pocz, sr, kon);   // Łączenie części lewej i prawej
     }
}

 printf ("2dlugosc= %d \n",dlugosc);

    int p=1;
    int i=0;
    int c=fgetc(odczyt);
    void *tmp;

    while ((c=fgetc(odczyt))!= EOF) //dopki odczyt rozny od konca pliku
        {
          tab[i]=fgetc(odczyt);
          i++;
          int d=0;
          while (i>=(dlugosc-1))// kiedy i będzie takie samo lub równe pierwotnej długosci ciagu
              {                 // realokuj pamięć

                d++;

                p=2*p;
                realloc(tab, p * rozmiar * sizeof *tab);
                if ((tmp = realloc(tab, p * rozmiar * sizeof *tab)) == NULL)
                 {
                   printf ("Błąd relokacji \n");
                   exit(1);
                 }

                realloc(pomoc, p * rozmiar * sizeof *pomoc);
                if ((tmp = realloc(pomoc, p * rozmiar * sizeof *pomoc)) == NULL)
                 {
                   printf ("Błąd relokacji \n");
                   exit(1);
                 }

                dlugosc=(p * rozmiar * sizeof *pomoc);
              }

    printf ("d= %d \n",d);

        }
 printf ("3dlugosc= %d \n",dlugosc);

 sortowanie(0,dlugosc-1);

    for (i=0; i<dlugosc; i++) /*ZAPIS DO PLIKU*/
      {
        fputc(tab[i], zapis);
        printf("%c",tab[i]);// wypisanie znaków wedrujacych do pliku na ekran
        //fprintf(zapis, "%c",tab[i]);
      }

    printf("\nSortowanie zakonczone, posortowane dane znajduja sie w pliku %s\n", argv[2]);

    fclose(odczyt);
    fclose(zapis);

  return 0;
}

 


Viewing all articles
Browse latest Browse all 21942