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

Lekcja 4.33

Ostatnio zmodyfikowano 2016-08-29 21:34
Autor Wiadomość
Anonim47
Temat założony przez niniejszego użytkownika
Lekcja 4.33
» 2016-07-26 20:55:22
Witam.
Mam problem z rozwiązaniem tego problemu bez rezerwacji tablic.
Jak można bez rezerwacji np.liczba[100],zarezerwować tylko tyle ile jest wyrazów w pliku.
C/C++
#include <iostream>
#include <fstream>

using namespace std;
bool odczytajDane( string nazwapliku )
{
    int suma = 0;
    ifstream plik;
    plik.open( nazwapliku.c_str() );
    if( !plik.good() )
         return false;
   
    int i = 0, liczba[ 100 ];
    while( true )
    {
        plik >> liczba[ i ];
        cout << liczba[ i ] << " ";
        suma += liczba[ i ];
        i++;
        if( !plik.good() )
        {
            cout << "\n Suma wynosi:" << suma << endl;
            return true;
        }
    }
    return true;
}
int main()
{
    string nazwapliku = "plik.txt";
    if( !odczytajDane( nazwapliku ) )
         cout << "Nie udalo sie odczytac danych" << endl;
   
    return 0;
}
P-150279
carlosmay
» 2016-07-26 21:38:54
std::vector<> - dynamicznie dodaje elementy (póki jest miejsce).
P-150285
Anonim47
Temat założony przez niniejszego użytkownika
» 2016-07-27 12:30:42
@carlosmay
Dzięki za podpowiedź.
PS. Kod wstawiłem tak
C/C++
while( true )
{
    plik >> x;
    dane.push_back( x );
    cout << dane[ i ] << "\n";
    suma += dane[ i ];
    i++;
   
    if( !plik.good() )
    {
        cout << "\n Suma wynosi:" << suma << endl;
        return true;
    }
}
P-150300
carlosmay
» 2016-07-27 14:13:53
PS. Kod wstawiłem tak
Można to jeszcze uprościć:
C/C++
while( plik >> x ) {
    dane.push_back( x );
}
P-150303
jundymek
» 2016-08-18 00:17:28
Mam problem z opisywanym zadaniem. Niestety utknąłem i starałem się wzorować na kodzie opisanym w tym temacie. Mam coś takiego:

C/C++
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

bool wczytaj_plik( string dane )
{
   
    ifstream plik;
    plik.open( dane.c_str() );
    if( !plik.good() )
         return false;
   
    int x;
    int suma = 0;
    int i = 0;
    vector < int > liczba;
    while( true )
    {
        plik >> x;
        liczba.push_back( x );
        cout << liczba[ i ] << "\n";
        suma += liczba[ i ];
        i++;
        if( !plik.good() )
        {
            cout << "SUMA: " << suma;
            cout << liczba.size();
            return true;
        }
    } return true;
}

int main() {
    string dane = "liczby.txt";
    wczytaj_plik( dane );
    return 0;
}

W pliku tekstowym mam 1 4 5.

cout << liczba[ i ] << "\n"
zwraca mi 1 4 5 5. Program dwukrotnie wypisuje ostatnią liczbę i wynik jest zawsze powiększony o tą liczbę. Gdzie popełniam błąd?
P-150960
carlosmay
» 2016-08-18 06:33:37
Program dwukrotnie wypisuje ostatnią liczbę i wynik jest zawsze powiększony o tą liczbę.
Ponieważ ustawienie flagi dla metody good() na false nastąpi po nieudanej próbie odczytania danch,
czyli niewłaściwa kolejność operacji.
Tak powinna być:
  • pobierasz dane z pliku
  • sprawdzasz czy udało się pobrać (if(plik.good())
  • jeśli tak dodaj dane do kontenera i wykonaj pozostałe zaplanowane operacje

Post wyżej jest fajny i skuteczny sposób pobierania danych z pliku przy użyciu pętli while
P-150966
jundymek
» 2016-08-18 09:45:46
Post wyżej jest fajny i skuteczny sposób pobierania danych z pliku przy użyciu pętli while

Tak - działa bez zarzutu. Niemniej chciałem spróbować przerobić ten sposób z vectorem i niestety nie udaje mi się. Zamieniłem if(!plik.good()) na if(plik.good()) i dalej pobiera mi podwójnie ostatnią liczbę...

C/C++
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

bool wczytaj_plik( string dane )
{
   
    ifstream plik;
    plik.open( dane.c_str() );
    if( !plik.good() )
         return false;
   
    int x;
    int suma = 0;
    int i = 0;
    vector < int > liczba;
    while( true )
    {
        if( plik.good() )
        { plik >> x;
            liczba.push_back( x );
            cout << liczba[ i ] << "\n";
            suma += liczba[ i ];
            i++; }
        else
        {
            cout << "SUMA: " << suma;
            cout << liczba.size();
            return true;
        }
    } return true;
}

int main() {
    string dane = "liczby.txt";
    wczytaj_plik( dane );
    return 0;
}
P-150971
carlosmay
» 2016-08-18 11:42:58
Nadal jest niewłaściwa kolejność.
Ma być:
  • wczytaj dane do zmiennej
  • sprawdź poprawność wczytywania (jeśli udane dopisz do vectora, w przeciwnym razie wyjdź z funkcji)

ps. funkcja zwraca wartość typu
bool
, a nic z tym nie robisz.
P-150972
« 1 » 2
  Strona 1 z 2 Następna strona