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[])// plik z którego chcemy odczytać znaki i do, którego chcemy
{ // je zapisać podajemy jako parametry programu przy jego
FILE *odczyt; // wywołaniu
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 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);// takimi wydrukami sprawdzam do którego momentu działa program
sortowanie(0,dlugosc-1);
fputs(tab, zapis);
printf("\nSortowanie zakonczone, posortowane dane znajduja sie w pliku %s\n", argv[2]);
fclose(odczyt);
fclose(zapis);
return 0;
}