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

[Rozdzial 33] przykład a zadanie

Ostatnio zmodyfikowano 2017-05-24 17:48
Autor Wiadomość
amacotti
Temat założony przez niniejszego użytkownika
[Rozdzial 33] przykład a zadanie
» 2017-05-23 21:08:42
Przykład z rodzialu 33:
 
C/C++
.bool wczytajPlik( std::string nazwaPliku )
{
    std::ifstream plik;
    plik.open( nazwaPliku.c_str() );
    if( !plik.good() )
         return false;
   
    while( true ) //pętla nieskończona
    {
        int a;
        std::string b;
        int c;
        plik >> a >> b >> c;
        if( plik.good() ) <- czemu tutaj to dzia ł a ? tzn czemu zwraca true je ś li plik si ę sko ń czy ł ?
             wykonajOperacje( a, b, c );
        else
             break; //zakończ wczytywanie danych - wystąpił jakiś błąd (np. nie ma więcej danych w pliku)
       
    } //while
    return true;
}

Fragment zadania 
C/C++
bool policzLiczby( std::string sciezka )
{
    std::ifstream plik;
    plik.open( sciezka.c_str() );
    if( !plik.good() )
         return false;
   
    int wynik = 0;
    int a;
    while( true ) // pętla nieskończona
    {
        plik >> a;
        if( plik.good() ) < a tutaj to nie dzia ł a ?
        {
            wynik += a;
        }
        else break;
       
    }
    std::cout << " suma liczba w pliku to: " << wynik << std::endl;
   
    return true;
}

W programie z zadania nie dodaje mi ostatniej liczby(wczytuje się,sprawdzałem) nie dodaje się ponieważ nie spełnia się warunek if, bo już nie ma co wczytać z pliku, dlatego, że plik.good() daje nam false. W takim przypadku dlaczego działa to w przykładzie? tam też jest wczytanie przed warunkiem dokładnie jak u mnie
P-161484
maly7
» 2017-05-23 22:21:05
A jak wygląda twój plik? Mi podany przez ciebie program wczytuje wszystkie liczby z pliku.
P-161487
amacotti
Temat założony przez niniejszego użytkownika
» 2017-05-23 22:46:14
Dokładnie mój kod wygląda tak:
C/C++
#include <fstream>
#include <iostream>
#include <string>



bool wczytajPlik( std::string nazwaPliku )
{
    std::ifstream plik;
    plik.open( nazwaPliku.c_str() );
    if( !plik.good() )
         return false;
   
    int wynik = 0;
    while( true ) // pêtla nieskoñczona
    {
        int a;
       
        plik >> a;
        if( plik.good() )
             wynik = wynik + a;
        else
             break; // konczy wczytywanie danych wyst¹pi jakiœ b³¹d, przerywa pêtle
       
    }
    std::cout << wynik;
    return true;
}

int main()
{
    if( !wczytajPlik( "liczby.txt" ) )
         std::cout << "Nie uda³o siê otworzyæ pliku" << std::endl;
   
    return 0;
}

a plik stworzyłem w notatniku i jego zawartość to:
"2 3 5 7"
W tym wypadku nie wczytuje mi 7.

edit.

Przez Twoje pytanie o plik txt pomyślałem, że jak dam spację po ostatniej liczbie to może zadziała i faktycznie zadziałało. Także dziękuję. Dla podsumowania metoda plik.good() - zwraca wartość true jeśli jest możliwe wczytanie,(w moim przypadku wczytywało spację i zwróciło prawdę.

ps.
Wiem, że draże temat, ale chciałbym być pewien na 100% bo może przyda się to kiedyś.
P-161489
karambaHZP
» 2017-05-23 23:59:03
w moim przypadku wczytywało spację i zwróciło prawdę
Bardziej obstawiam inny błąd, ponieważ operator
>>
 pomija poprzedzające białe znaki.
Najwidoczniej metoda
good()
 doczytując do końca pliku ustawia flagę na
false
.
Wtedy pomija operację na liczbie.

if( !plik.fail() )
 lub
if( !plik )
 lub
if( !plik.eof() )
 powinno zadziałać dobrze.
P-161494
amacotti
Temat założony przez niniejszego użytkownika
» 2017-05-24 17:48:45
Dzięki, twoje wyjaśnienie ma sens
też zadziałało:
C/C++
if( plik >> a )
P-161538
« 1 »
  Strona 1 z 1