EDIT Zapomniałem o tym, że posortowane zostały również znaki nowych linii, wystarczyło przewinąć plik do końca. Problem rozwiązany.
Hej! Piszę program wczytujący znaki z pliku, sortujący je według kodów ASCII, a następnie zapisujący posortowane dane do drugiego pliku. W tym momencie pojawia się problem, ponieważ do pliku zapisywane są mniej więcej tylko polskie znaki specjalne, nie wiem dlaczego tak się dzieje i proszę o jakąś wskazówkę. Jako przykładowych danych używam Pana Tadeusza, program uruchamia się z jednoczesnym podaniem parametrów będących nazwami plików do odczytu i zapisu.
#include <stdio.h>
int main(int argc, char*argv[])
{
FILE *odczyt;
FILE *zapis;
if(argc<2)
{
printf("Za mala liczba argumentow.\nWprowadz dane w formacie %s plik_do_odczytu.txt plik_do_zapisu.txt",argv[0]);
exit(1);
}
odczyt = fopen (argv[1], "r");
if (odczyt==NULL)
{
printf ("Nie mogę otworzyć pliku %s do odczytu!\n",argv[1]);
exit(1);
}
zapis = fopen (argv[2], "w");
if (zapis==NULL)
{
printf ("Nie mogę otworzyć pliku %s do zapisu!\n",argv[2]);
exit(1);
}
fpos_t dlugosc;
fseek (odczyt, 0, SEEK_END); //ustawiamy wskaŸnik na koniec pliku
fgetpos (odczyt, &dlugosc);
fseek (odczyt, 0, SEEK_SET);
char tab[dlugosc];
char pomoc[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
}
}
int i;
for (i=0;i<dlugosc;i++)
{
tab[i]=fgetc(odczyt);
}
sortowanie(0,dlugosc-1);
printf("\nZbior po sortowaniu:\n");
for (i=0; i<dlugosc; i++) /*ZAPIS DO PLIKU*/
{
//fputc(tab[i],zapis); jakby co to z tym tez nie dziala
fprintf(zapis, "%c",tab[i]);
printf("%c ", tab[i]);
}
fclose(odczyt);
fclose(zapis);
return 0;
}