• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błędny zapis danych do pliku C

Object Storage Arubacloud
0 głosów
201 wizyt
pytanie zadane 30 października 2016 w C i C++ przez kyly Początkujący (260 p.)
edycja 30 października 2016 przez kyly

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;
}
komentarz 30 października 2016 przez niezalogowany
Podał przykładowe dane / pliki dla jakich to się dzieje + popraw swoje formatowanie kodu bo wcięcia masz jakieś rozsypane
komentarz 30 października 2016 przez kyly Początkujący (260 p.)
Przy wywołaniu programu od razu podaje się nazwę pliku, z którego chcemy odczytać dane i nazwę pliku do którego chcemy je zapisać, a jako przykładowych danych używam Pana Tadeusza.
komentarz 30 października 2016 przez kyly Początkujący (260 p.)

Dobra, już nie ważne. Jestem idiotą, reszta liter była za posortowanymi znakami nowych lini i spacji, wystarczyło przewinąć plik do końca. laughfrown

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 1,084 wizyt
pytanie zadane 20 listopada 2016 w C i C++ przez Eleven Nowicjusz (220 p.)
+3 głosów
4 odpowiedzi 1,710 wizyt
pytanie zadane 30 czerwca 2015 w C i C++ przez Phobos Użytkownik (720 p.)
0 głosów
1 odpowiedź 2,158 wizyt
pytanie zadane 20 marca 2019 w C i C++ przez whitematt Nowicjusz (120 p.)

92,568 zapytań

141,420 odpowiedzi

319,617 komentarzy

61,953 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...