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

Błędne wyświetlenie znaków odczytanych z pliku.

VPS Starter Arubacloud
0 głosów
235 wizyt
pytanie zadane 8 listopada 2016 w C i C++ przez kyly Początkujący (260 p.)
edycja 9 listopada 2016 przez kyly

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

 

komentarz 9 listopada 2016 przez Maksiu Maksiuas Nowicjusz (100 p.)
Po pracy jak najbardziej wrzucę rozwiązanie :P
komentarz 9 listopada 2016 przez kyly Początkujący (260 p.)

Byłbym wdzięczny smiley

komentarz 9 listopada 2016 przez niezalogowany
Patrząc na rezultat to oczywistym jest fakt że gdzieś wychodzisz poza zakres, btw putc to strasznie niewydajne, nie lepszy byłby fputs?
komentarz 9 listopada 2016 przez kyly Początkujący (260 p.)
Jakoś zapomniałem przedtem o fputs, ale rzeczywiście to lepsze rozwiązanie niż fputc. Natomiast nie mam pojęcia, w którym momencie mogę wychodzi poza zakres, ponieważ zarezerwowanej pamięci mam dużo, a w pliku do celów testowych mam jedynie kilka znaków.

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

Podobne pytania

0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 20 września 2016 w C i C++ przez L33TT12 Gaduła (3,950 p.)
0 głosów
1 odpowiedź 153 wizyt
pytanie zadane 6 października 2016 w HTML i CSS przez Marek J Nowicjusz (140 p.)
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 24 lutego 2019 w C i C++ przez Curiosis Użytkownik (540 p.)

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...