Reklama
Pokazuje wyniki od 1 do 11 z 11

Temat: [c++] Nadprogramowy znak z pliku

  1. #1
    Avatar Celestian hunter
    Data rejestracji
    2006
    Położenie
    Gliwice
    Wiek
    32
    Posty
    1,059
    Siła reputacji
    19

    Domyślny [c++] Nadprogramowy znak z pliku

    Dziwne rzeczy się dzieją; albo jestem ślepy i nie widzę jakiegoś oczywistego błędu, albo zgłupiałem do końca.
    Program ma robić kodowanie rle, ale wrzucam tu tylko ten powycinany fragment:

    Kod:
    char znak2 = NULL;
    
    while(!plik.eof())
    {
    		
    		plik.get(znak2);
    		cout << znak2;
    		
    }
    Jeśli zawartością pliku będą dla przykładu dwa znaki: "ef", to po program wypluje "eff".
    Czemu ;o

  2. #2

    Data rejestracji
    2010
    Położenie
    Aͦͯ͐̾͐ͦ̋̽́̎̀͗̌͡͏̸&#7
    Posty
    2,138
    Siła reputacji
    15

    Domyślny

    daj cały kod (z obsługą pliku) bo jak wklejam twój fragment to pętla się nie kończy, być może zapomniałem o czymś banalnym ;p
    @
    nvm przez pomyłkę zapisywałem egzeka w złym folderze xD
    Ostatnio zmieniony przez niemoralny : 12-11-2013, 21:21

  3. Reklama
  4. #3
    Avatar Celestian hunter
    Data rejestracji
    2006
    Położenie
    Gliwice
    Wiek
    32
    Posty
    1,059
    Siła reputacji
    19

    Domyślny

    Cały, nieskomentowany kod, który kompiluję:
    Kod:
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(){
    fstream plik; 
    plik.open("dane.txt", ios::in);
    if(!plik.good())
    	return 0;
    
    char znak2 = NULL;
    
    while(!plik.eof())
    {
    		
    		plik.get(znak2);
    		cout << znak2;
    }
    plik.close();
    getchar();
    return 0;
    }
    Zawartość pliku "dane.txt": e
    Wynik na ekranie: ee


    ...eee? ;d

  5. #4
    Avatar Tibiarz
    Data rejestracji
    2008
    Położenie
    Tibiantis
    Wiek
    4
    Posty
    16,098
    Siła reputacji
    27

    Domyślny

    A nie jest tak, że eof zostanie ustawione dopiero gdy będziesz na końcu pliku i wtedy spróbujesz odczytać kolejny znak, a nie po przeczytaniu ostatniego znaku?
    Znaczy, masz kursor ustawiony za ostatnim znakiem, ale program jeszcze nie wie, że to ostatni znak, więc dopiero gdy będziesz chciał jeszcze raz przesunąć kursor w prawo, to skapnie się, że to był już koniec pliku. Dlatego do pętli wchodzi ci o jeden raz za dużo?
    Ostatnio zmieniony przez Tibiarz : 12-11-2013, 21:27

  6. #5

    Data rejestracji
    2010
    Położenie
    Aͦͯ͐̾͐ͦ̋̽́̎̀͗̌͡͏̸&#7
    Posty
    2,138
    Siła reputacji
    15

    Domyślny

    śmieszna sprawa, u mnie to samo jest xd najlepsze jest to, że
    Kod:
    while(true))
        {
                    if(plik.eof()){break;}
    		plik.get(znak2);
    		cout << znak2;
       }
    daje taki sam efekt, co
    Kod:
    while(true))
        {
    
    		plik.get(znak2);
    		cout << znak2;
                    if(plik.eof()){break;}
       }
    @up
    do while - tak samo

  7. #6
    Avatar Tibiarz
    Data rejestracji
    2008
    Położenie
    Tibiantis
    Wiek
    4
    Posty
    16,098
    Siła reputacji
    27

    Domyślny

    Ale patrzcie (drug kod nienormalnego):
    Wchodzi do pętli, czyta to "e" (zakładamy, że plik to po prostu znak e). Potem sprawdza czy został już osiągnięty koniec pliku, a teoretycznie jeszcze nie został, kursor jest ustawiony za ostatnim znakiem i dopiero teraz gdy będziesz chciał coś przeczytać, to osiągniesz koniec pliku. Więc znowu próbuje wczytać znak, ale to się nie udaje, bo tam już nic nie ma, jednocześnie ustawia znacznik eof na true, potem wypisuje znowu tamtą zmienną i dopiero potem warunek nie jest spełniony i wychodzi z pętli.

    Wniosek:
    Kod:
    while(true))
        {
    
    		plik.get(znak2);
    		cout << znak2;
                    if(plik.eof()){break;}
       }
    zamienić na

    Kod:
    while(true))
        {
    
    		plik.get(znak2);
                    if(plik.eof()){break;}
    		cout << znak2;
       }
    Ostatnio zmieniony przez Tibiarz : 12-11-2013, 21:38

  8. #7
    Avatar Frozelix
    Data rejestracji
    2006
    Położenie
    Siedlce
    Wiek
    32
    Posty
    416
    Siła reputacji
    18

    Domyślny

    Nie mam zainstalowanego srodowiska, ale
    Kod:
    while (!plik.eof())    
       {
          znak2 = plik.get();   
          cout << znak2;
       }
    sprobuj tak :p
    @edit
    Nie no, chyba nie prawil dobrze. Funkcja get przesuwa wskaznik za "e" i potem plik.eof juz widzi ze wskaznik wskazuje na koniec pliku i przerywa petle. Po prostu zle uzyles funkcji .get().
    Ostatnio zmieniony przez Frozelix : 12-11-2013, 21:37
    Siedlce Team
    Created: Sep 22 2004, 14:24:00 CEST[*]

    "Naród wspaniały, tylko ludzie kurwy."
    Józef Piłsudski

  9. #8
    Avatar Celestian hunter
    Data rejestracji
    2006
    Położenie
    Gliwice
    Wiek
    32
    Posty
    1,059
    Siła reputacji
    19

    Domyślny

    O wygugliłem
    Czyli tibia77 chyba dobrze prawił ;o

    Ale rozwiązanie Frozelixa załatwiło sprawę, wszystko hula, dzięki <3

  10. #9
    Avatar Tibiarz
    Data rejestracji
    2008
    Położenie
    Tibiantis
    Wiek
    4
    Posty
    16,098
    Siła reputacji
    27

    Domyślny

    Cytuj Frozelix napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Nie mam zainstalowanego srodowiska, ale
    Kod:
    while (!plik.eof())    
       {
          znak2 = plik.get();   
          cout << znak2;
       }
    sprobuj tak :p
    @edit
    Nie no, chyba nie prawil dobrze. Funkcja get przesuwa wskaznik za "e" i potem plik.eof juz widzi ze wskaznik wskazuje na koniec pliku i przerywa petle. Po prostu zle uzyles funkcji .get().
    Nie. W twoim rozwiązaniu jeśli używasz tam podstawienia, a nie udało się nic przeczytać, to za znak2 jest wstawiany '\0', dlatego cout nie wypisuje tej ostatniej literki powtórnie. Co nie zmienia faktu, że nadal program dochodzi do tego miejsca (po przeczytaniu ostatniego znaku i tak włazi w pętlę jeszcze raz), bo nie masz racji co do tego, kiedy eof ustawiane jest na true.

    Dowód:

    Moje rozwiązanie


    Twoje rozwiązanie


    On użył funkcji get dobrze, a jedyna różnica między twoim kodem a jego jest taka, że u niego gdy nie uda się nic przeczytać, to znak2 pozostaje bez zmian, a u ciebie zmienia się na '\0'. Ale jak widzisz, tak czy siak mamy wypisany jeden nadprogramowy znak.
    Ostatnio zmieniony przez Tibiarz : 12-11-2013, 22:28

  11. #10
    Avatar Bazan
    Data rejestracji
    2008
    Wiek
    31
    Posty
    1,909
    Siła reputacji
    18

    Domyślny

    Kod:
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main(){
    fstream plik; 
    plik.open("dane.txt", ios::in);
    if(!plik.good())
    	return 0;
    
    char znak2 = NULL;
    
    while(	plik.get(znak2) && !plik.eof())
    {
    		
    		cout << znak2;
    }
    plik.close();
    getchar();
    return 0;
    }
    Zadzialalo mi dobrze :)
    Dreaming by drumming. ˆˆ™

  12. #11
    Avatar Tibiarz
    Data rejestracji
    2008
    Położenie
    Tibiantis
    Wiek
    4
    Posty
    16,098
    Siła reputacji
    27

    Domyślny

    @up
    Kod:
    while(plik.get(znak2))
    {
       cout << znak2;
    }
    Powinno wystarczyć, bo raczej nie zaistnieje taka sytuacja, żebyś przeczytał kolejny znak, mimo osiągnięcia końca pliku, lub na odwrót (eof będzie true, tylko jeśli nie uda ci się przeczytać następnego znaku).

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Znak wodny
    Przez Urlak w dziale O wszystkim i o niczym
    Odpowiedzi: 3
    Ostatni post: 03-04-2016, 12:08
  2. C++ Wczytywanie z pliku + tworzenie pliku
    Przez Kokolik w dziale Programowanie
    Odpowiedzi: 1
    Ostatni post: 01-12-2014, 20:13
  3. Znak w hotkeyach
    Przez PpK w dziale Tibia
    Odpowiedzi: 4
    Ostatni post: 14-09-2012, 20:23
  4. Odszumianie, podgłaśnianie i podbijanie wyraźności pliku głosowego AMR
    Przez Skazaniec w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 5
    Ostatni post: 20-11-2011, 13:51
  5. [Poradnik] Jak zrobić clienta Tibii w jednym pliku!
    Przez Avixu w dziale Tibia
    Odpowiedzi: 1
    Ostatni post: 28-02-2010, 14:29

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •