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

Rozdział 34 - zadanie domowe 1

Ostatnio zmodyfikowano 2016-09-10 13:50
Autor Wiadomość
Speedwaymonia93
Temat założony przez niniejszego użytkownika
Rozdział 34 - zadanie domowe 1
» 2016-09-08 18:00:50
Czy moglibyście mi sprawdzić ten kod. Plik się kompiluje ale wyskakuje komunikat że sie nie otworzył. Próbowałam wpisać świeżkę wzgldną i bezwględną i nic się nie zmienia. Oto kod:
C/C++
#include <iostream>
#include <fstream>
#include <string>
bool wczytaj_liczbe( std::ifstream & plik, int & liczba )
{
    plik.clear();
    int suma = 0;
    while( !plik.eof() )
    { plik >> liczba;
       
        if( plik.fail() )
        { std::cout << "Nie udalo sie wczytac liczby" << std::endl;
        }
        else
             std::cout << liczba << " " << std::endl;
       
        std::cout << std::endl;
       
        suma += liczba;
        std::cout << "Suma wynosi: " << suma << std::endl;
    }
}

bool wczytaj_znak( std::ifstream & plik, char & znak )
{
    while( !plik.eof() )
    {
        plik >> znak;
        if( plik.fail() )
             break;
       
    }
   
}
bool odczytaj( std::string nazwa )

{ std::ifstream plik;
    plik.open( nazwa.c_str() );
    if( !plik.good() )
         return false;
   
    std::cout << "Nie udalo sie otworzyc pliku" << std::endl;
    if( plik.good() )
         return true;
   
    std::cout << "Udalo sie otowrzyc plik!" << std::endl;
   
    if( plik.bad() )
    {
        plik.close();
        return false;
        std::cout << "Odczytanie pliku zakonczylo sie niepowodzeniem" << std::endl;
    }
   
    while( !plik.eof() )
    { int iliczba;
        char iznak;
        if( !wczytaj_liczbe( plik, iliczba ) && plik.bad() )
        { return false;
        }
        else
       
        if( !wczytaj_znak( plik, iznak ) )
        { return false;
        }
        if( plik.bad() )
        { return false;
        }
        plik.close();
        return true;
    }
}

int main()

{
    if( odczytaj( "dane1.txt" ) );
   
    std::cout << "Wczytalo sie!";
}
P-151561
carlosmay
» 2016-09-08 18:39:44
C/C++
if( !plik.good() ) // if nie plik dobry, ale plik dobry,
     return false; // pomija tą linijkę, bo (!plik.good() == false) i jest to jedyna linijka w tej instrukcji warunkowej

std::cout << "Nie udalo sie otworzyc pliku" << std::endl; // to jest odrębna instrukcja, wykonywana zaraz po ifie
if( plik.good() )
     return true;

std::cout << "Udalo sie otowrzyc plik!" << std::endl; // a ta wcale się nie wykona, jak plik jest dobry
A gdzie klamerki?
P-151564
Speedwaymonia93
Temat założony przez niniejszego użytkownika
» 2016-09-09 10:04:22
Poprawiłam i nadal nie dziala. Wypisuje komunikaty "Nie udalo sie wczytac liczby" oraz "Wczytalo sie" natomiast nie wczytuje liczb
P-151578
karambaHZP
» 2016-09-09 10:35:34
Plik bez ruszania wskaźnika odczytu można odczytać tylko jeden raz.
Jak już dojedzie do końca to każda następna próba odczytu to błąd.
Wskaźnik sam nie wróci na początek, musisz sama sie tym zająć.
W kursie jest o tym w temacie o poruszaniu się po pliku.
P-151579
Speedwaymonia93
Temat założony przez niniejszego użytkownika
» 2016-09-09 11:15:54
Oto kod po poprawkach i waszych sugestiach. Ale nadal wypisuje mi komunikaty "Nie udalo sie wczytac liczby" i "Nie udalo sie wczytac pliku.
C/C++
#include <iostream>
#include <fstream>
#include <string>
bool wczytaj_liczbe( std::ifstream & plik, int & liczba )
{
    plik.clear();
    int suma = 0;
    plik >> liczba;
    if( plik.bad() )
    {
        std::cout << "Wystapil blad sprzetowy!" << std::endl;
        plik.close();
        return false;
    } else
   
    if( plik.fail() )
    {
        std::cout << "Nie udalo sie wczytac liczby" << std::endl;
        return false;
    }
    else
         std::cout << liczba << " " << std::endl;
   
    std::cout << std::endl;
    suma += liczba;
    std::cout << "Suma wynosi: " << suma << std::endl;
    return true;
}

bool wczytaj_znak( std::ifstream & plik, char & znak )
{
    plik.clear();
    plik >> znak;
    if( plik.bad() )
    {
        std::cout << "Wystapil blad sprzetowy!" << std::endl;
        plik.close();
        return false;
    } else
    if( plik.fail() )
    {
        std::cout << "Nie udalo sie wczytac znaku!" << std::endl;
        return false;
    }
    return true;
   
}
bool odczytaj( std::string nazwa )
{
    std::ifstream plik;
    plik.seekg( 0 );
    plik.open( nazwa.c_str() );
    if( !plik.good() )
    { return false; }
   
    while( !plik.eof() )
    {
        int iliczba;
        char iznak;
        if( !wczytaj_liczbe( plik, iliczba ) && plik.bad() )
        { return false;
        }
        else
       
        if( !wczytaj_znak( plik, iznak ) )
        {
            if( plik.fail() )
                 return false;
            else
                 break;
           
        }
        plik.close();
        return true;
    }
}
int main()

{
    if( !odczytaj( "D:\\CodeBlocks\\ZADANIA DOMOWE\\POZIOM 4\\lekcja 34\\dane1.txt" ) );
   
    std::cout << "Nie udalo sie wczytac pliku!";
    return 0;
}
P-151580
karambaHZP
» 2016-09-09 12:02:56
Raczej nie otwiera ci się plik. Poza tym teraz
seekg
 nie jest już potrzebny.
W poprzednim był, bo wszędzie było czytanie do końca pliku. Tak przy okazji - seekg jest w złym miejscu.
P-151582
Speedwaymonia93
Temat założony przez niniejszego użytkownika
» 2016-09-10 10:01:44
Wiem że mi się nie otwiera ale nie wiem czemu. Proszę o jakieś wskazówki jakbym mogła ten problem rozwiązać bo już siedzę nad tym drugi dzień i nie mogę nic wykombinować.
P-151620
carlosmay
» 2016-09-10 13:50:05
Pozbądź się spacji ze ścieżki (czasem to pomaga) lub masz źle wpisaną ścieżkę.
P-151635
« 1 »
  Strona 1 z 1