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; }