Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[c++] Pytania dotyczące kursu (cin,koniec pliku,przekazywanie pliku do funkcji)

Ostatnio zmodyfikowano 2015-08-26 12:33
Autor Wiadomość
Bonobo
Temat założony przez niniejszego użytkownika
[c++] Pytania dotyczące kursu (cin,koniec pliku,przekazywanie pliku do funkcji)
» 2015-08-26 03:03:29
Witam, mam trzy pytania dotyczące kursu. Są one drobne więc umieszczam je w jednym temacie żeby nie tworzyć trzech małych tematów jednocześnie zaśmiecając forum.
Pytanie 1:
W lekcji 34 http://cpp0x.pl/kursy/Kurs-C++​/Poziom-4​/Wczytywanie-zawartosci-pliku-​a-kontrola-bledow​/485 mamy za zadanie wczytać liczby które są pomieszane ze znakami i je zsumować.Z kursu dowiedziałem się że cin wczytuje  znaki aż do napotkania znaku białego. W treści pliku mamy taki fragment "321b9". Do zmiennej typu całkowitego mój program przypisuje  "321", następnie omijam "b" i znów przypisuje liczbę - "9". Pomiędzy tymi liczbami nie ma znaku białego, więc jak to się dzieje że program nie wczytuję całego ciągu (co by się zakończyło błędem) tylko potrafi sobie porozdzielać te dane?
Pytanie 2:
W tej samej lekcji drugie zadanie dotyczące sumowania poszczególnych wersów i pytanie odnośnie końca pliku.
C/C++
while( !Plik.eof() )
{
    bGood = true;
    iSuma = 0;
    ++iWers;
    while( !czyNapotkanoZnakNowegoWiersza( Plik ) )
    {
        Plik >> iLiczba;
        if( Plik.bad() || Plik.fail() )
        {
            cout << "Napotkano blad w " << iWers << " wersie !!" << endl; // Tak bylo po zmianie
            iLiczba = 0;
            Plik.clear();
            do
            {
                Plik >> cZnak;
            } while( !czyNapotkanoZnakNowegoWiersza( Plik ) ); // <------TU :)
            //Tak bylo przed  zmiana cout << "Napotkano blad w " << iWers << " wersie !!" << endl;
            bGood = false;
        }
        if( bGood ) iSuma += iLiczba;
        else break;
       
    }
    if( bGood )
         cout << "Suma w " << iWers << " wersie wynosi: " << iSuma << endl;
   
}
 W ostatniej (5) linijce pierwszy znak nie był liczbą więc program pokazywał "Napotkano błąd", z tym że kończyły mi się wszystkie pętle w momencie gdy pętla ze znacznikiem "TU" dochodziła do końca pliku, i nawet linijki cout nie zostały zrealizowane, mam na myśli linię przed zmianą. Po przeniesieniu jej przed pętle wszystko działało elegancko. Stąd moje pytanie - Dlaczego "przed zmianą" się nie wykonywało skoro to nie był koniec pętli ani nie było sprawdzania warunku eof?

Pytanie 3:
Ostatnie pytanie najdrobniejsze :) Dlaczego program się nie kompiluje jeżeli chce przekazać zmienną plikową do funkcji bez referencji ? Nie widziałem nigdzie żeby było coś wspomniane na ten temat a jednak Visual Studio wymaga ampersandu :)


Trochę jednak tego wyszło, ale mam nadzieję że nie zostanie ten temat usunięty gdyż zwyczajnie nie mam problemu z zadaniem a jedynie nie do końca wiem czemu działa ;)
Pozdrawiam
P-136885
carlosmay
» 2015-08-26 06:37:50
1. Operator >> jest "inteligentny" i wie na podstawie typu zmiennej jakie dane ma wczytać do tej zmiennej.
W tym przykładzie normalnie wczytuje liczbę do napotkania białego znaku, ale jesli po drodze
Napotka inne dane niż oczekuje kończy wczytywanie i ustawia flagę błędu.
Dalsza praca z cin jest możliwa po usunięciu flagi błędu i pozbyciu się nieprawidłowego znaku ze strumienia.
2. Wyjście z pętli jest realizowane na podstawie zwróconej wartości z funkcji czyNapotkanoZnakNowegoWiersza(plik). Funkcja ta obsługuje nie tylko przypadek '\n', ale pewnie też czy udało się otworzyć plik, czy udalo się odczytać dane itd.
3. Bo chcesz pracować na pliku zewnętrznym. Musisz mieć adres żeby pracować na oryginale.
P-136887
Monika90
» 2015-08-26 10:21:16
ale jesli po drodze
Napotka inne dane niż oczekuje kończy wczytywanie i ustawia flagę błędu.
Operator >> wczytujący liczbę w formacie dziesiętnym nie ustawia flagi błędu gdy napotka na przykład 123b tylko wczyta 123, a b zostanie w strumieniu i następna operacja wejścia będzie mogła ten znak odczytać.


C/C++
if( Plik.bad() || Plik.fail() )
Jeżeli badbit jest ustawiony to fail zwraca true, więc bez sensu jest sprawdzać Plik.bad(), wystarczy samo Plik.fail().
P-136890
Bonobo
Temat założony przez niniejszego użytkownika
» 2015-08-26 12:33:16
Dziękuję bardzo za odpowiedzi, już jest znacznie jaśniej :) Co do Bad i Fail myślałem szczerze mówiąc że odpowiadają za różne rzeczy, przynajmniej w przykładowych programach występowały oba więc sądziłem że tak należy :)
Dziękuje i Pozdrawiam
P-136892
« 1 »
  Strona 1 z 1