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