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

Zadanie domowe 1. Rozdział 33

Ostatnio zmodyfikowano 2018-12-04 20:51
Autor Wiadomość
rosa
Temat założony przez niniejszego użytkownika
Zadanie domowe 1. Rozdział 33
» 2018-12-04 03:13:27
Witam Panowie, 2 pytania odnosnie zadanie z rozdziału 33. Moja pętla while za kazdym razem nie pokazuje mi ostatniej liczby z tekstu, w moim tekscie jest 10 liczb miedzy ktorymi sa biale znaki i niestety nie wiem czemu ale nie wyswietla mi sie ostatni z liczb (10). Druga sprawa to nie wiem jak mogę podliczyc sume 10 liczb skoro kryją sie one pod jedną zmienną, nie wiem jak zrobic wzor zeby kazda kolejna zmienna o nazwie a mi się sumowała, prosze o podpowiedz...


C/C++
#include "pch.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

bool wczytajPlik( std::string nazwaPliku )
{
    std::ifstream plik;
    plik.open( nazwaPliku );
    if( !plik.good() )
         return false;
   
    int a;
    while( true )
    {
        plik >> a;
        if( plik.good() )
             cout << a << endl;
       
        else
             break;
       
    }
   
   
   
   
    return true;
}

int main()
{
    if( !wczytajPlik( "D:/dane.txt" ) )
         std::cout << "Nie udalo sie otworzyc pliku!" << std::endl;
   
    return 0;
}
P-173090
rafallauterbach
Witam!
» 2018-12-04 05:48:05
1. (a lub b)
  a) z reguły pliki z danymi oddzielonymi białymi znakami kończą się białym znakiem (jeśli generujesz taki plik automatycznie, to też z reguły łatwej jest nie robić wyjątku dla ostatniej danej) Więc pierwsze rozwiązanie to dodaj biały znak na końcu swojego pliku z danymi.
  b) sprawdzaj, czy plik się skończył dopiero przed rozpoczęciem nowej pętli, a nie po wczytaniu liczby, ale przed jej wyświetleniem (dlatego ostatnia się nie pojawia w Twoim przykładzie -> "a" wczytuje liczbę, plik już != good więc a się nie pokazuje). Tylko, że przy pomyśle b) wszystko działa prawidłowo tylko gdy na końcu NIE MA białego znaku, więc też nie idealne rozwiązanie. Żeby to na szybko naprawić zeruję a po każdej pętli w przykładzie poniżej. (dzięki czemu jeśli dane są niewłaściwe/puste, to a=0 a nie a=poprzednie_a).
2.
  moim zdaniem najprościej będzie tu dodać zmienną suma i krok po kroku w każdej iteracji pętli dodawaj a do sumy, zbierzesz tak wszystkie a.


Jeśli ktoś ma bardizej estetyczny pomysł na rozwiązanie pierwszego problemu, niż 1.b) to byłbym zainteresowany.


Przykład :
C/C++
#include <fstream>
#include <iostream>
#include <string>

using namespace std;

bool wczytajPlik( std::string nazwaPliku )
{
    int suma = 0; //dodane;
    std::ifstream plik;
    plik.open( nazwaPliku );
    if( !plik.good() )
         return false;
   
    int a;
    while( true )
    {
        a = 0;
        plik >> a;
        cout << a << endl; //zmienione (teraz wypisuje bez względu na koniec pliku po wczytaniu)
       
        suma += a; // w każdej pętli dodajemy a do sumy
       
        if( !plik.good() ) //zmienione (teraz sprawdza, czy plik nie jest good)
             break;
       
    }
    cout << "W sumie : " << suma; //użycie końcowej sumy po wykonaniu pętli
   
   
   
   
    return true;
}

int main()
{
    if( !wczytajPlik( "dane.txt" ) )
         std::cout << "Nie udalo sie otworzyc pliku!" << std::endl;
   
    return 0;
}
P-173091
pekfos
» 2018-12-04 09:39:47
C/C++
if( plik.good() )
     cout << a << endl;
C/C++
if( !plik.fail() )
     cout << a << endl;
Ze wszystkich tych metod good(), fail(), bad(), eof(), jeśli którejś masz użyć, to na 99.9999% jest to fail(). Później przerobię lekcje w poziomie czwartym kursu by good() było opisane, ale już nie używane.
P-173092
rosa
Temat założony przez niniejszego użytkownika
» 2018-12-04 12:59:56
pekfos po zmianie z plik.good() na !plik.fail()  wszystk odziała jak należy, czy to z białym znakiem na koncu tekstu czy nie. Dziekuję za pomoc, ale nadal nie wiem czym to się rozni, przeciez to to samo, odwrotność good().  Nadal się zastanawiam czemu nie wyswietla mi ostatniej liczby, probuje sobie to wbic do głowy ze jak ostatnia liczba jest pobrana przez plik >> a to juz jej potem nie wyswietli ale przeciez skoro ją wczytało to plik.good() powinien ją pokazac...
P-173094
pekfos
» 2018-12-04 13:23:28
good() to nie jest negacja fail(). Jeśli eofbit jest jedyną ustawioną flagą, obie te metody zwracają false. Jeśli plik ma na końcu biały znak, odczyt ostatniej liczby nie ustawia żadnej flagi i good() działa poprawnie. Jeśli tego białego znaku nie ma, odczyt ostatniej liczby ustawi eofbit, bo osiągnięto koniec pliku, ale nie failbit, bo jednak jakąś liczbę odczytano. Wtedy testowanie good() zawodzi, bo zwraca błąd, podczas gdy masz poprawnie wczytaną liczbę.
P-173095
YooSy
» 2018-12-04 13:25:41
P-173096
rosa
Temat założony przez niniejszego użytkownika
» 2018-12-04 20:51:34
Szczerze nie mam pojęcia co mówi ta tableka i jak ją interpretowac, będę sie trzymal tego zeby sprawdzajac błedy robic po przez !fail
P-173102
« 1 »
  Strona 1 z 1