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

c++ zapis do pliku

Object Storage Arubacloud
0 głosów
152 wizyt
pytanie zadane 19 października 2020 w C i C++ przez milosz123 Użytkownik (720 p.)

Witam chciałem się dowiedzieć dlaczego jeśli nie użyję instrukcji if (!wewy.eof()) to wyświetla mi końcowy znak 2 razy mimo że jest instrukcja while (!wewy.eof()) oraz jak działa instrukcja wewy.clear() ponieważ też nie do końca to rozumiem oto kod: 

#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <cstdio>

using namespace std;

int main()
{
    fstream wewy;

    wewy.open("plikk.txt",fstream::in|fstream::out|fstream::trunc);
    for (unsigned i = 97; i < 123; i++) {
        char litera = char(i);
        wewy << litera;
        wewy.seekg(0);
        while (!wewy.eof()) {
            wewy >> litera;
            if (!wewy.eof()) cout << litera;
        }
        cout << "\n";
        wewy.clear();
    }
    wewy.close();


    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 19 października 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
wybrane 20 października 2020 przez milosz123
 
Najlepsza

Wystarczy, że zrobisz tak:
 

wewy >> litera;
while (!wewy.eof()) 
{ cout << litera;
  wewy >> litera; 
}

Jest to spowodowane tym, że w Twoim kodzie domyślnie znak pobierasz dopiero w pętli while(). Tyle, że warunek domyślnie jest spełniony, bo początek pliku nie jest jego końcem - jakkolwiek by to komicznie nie brzmiało - więc dostajesz coś takiego:
Sprawdzasz warunek - zgadza się, to nie koniec pliku
Pobierasz znak do zmiennej
Wypisujesz znak
Sprawdzasz warunek - to też nie jest koniec pliku, bo skończyłeś na literze 'a'
Pobierasz znak - koniec pliku
Nie wypisujesz znaku
Sprawdzasz warunek - nie jest spełniony, koniec pętli. 

Jeśli się mylę, niech mnie ktoś poprawi. Sam to rozgryzłem i nie wiem, czy aby na pewno dobrze.

EDIT: Co do metody clear() - z tego co wyczytałem, to czyści ona flagę błędu, która to jest ustawiana na 1, gdy pobierasz znak końca pliku. 
Co nieco się pobawiłem tym kodem i bez czyszczenia program robi mniej więcej tak: 
Wczytuje następną literę, czyli 'b'. Próbujesz ją wczytać do pliku, ale się to nie udaje. Następnie nie udaje się w ogóle odczytać już zapisanego 'a', więc w zmiennej 'litera' mamy wartość 'b'. Po wykonaniu wewy.seekg(0) metoda wewy.eof() zwraca 0, więc program wykonuje pętlę while(...) i tak nieskończoność, bo w pętli również nie udaje nam się pobrać następnego znaku z pliku. 
Wobec tego metoda clear() musi zerować jeszcze jakieś inne błędy, ale to już poczekajmy, aż ktoś biegły w języku się wypowie, jak działa ta metoda. 

+1 głos
odpowiedź 20 października 2020 przez j23 Mędrzec (194,920 p.)

Zrób po prostu:

while (wewy >> litera) {
    cout << litera;
}

 

Podobne pytania

+1 głos
1 odpowiedź 232 wizyt
pytanie zadane 14 stycznia 2021 w C i C++ przez Hakierman Nowicjusz (130 p.)
0 głosów
1 odpowiedź 307 wizyt
pytanie zadane 19 października 2021 w C i C++ przez Vifuso Nowicjusz (170 p.)
0 głosów
1 odpowiedź 127 wizyt
pytanie zadane 22 listopada 2021 w C i C++ przez kahxst Nowicjusz (150 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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!

...