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

[C++] Rozdzial 34 Zad. 2

Ostatnio zmodyfikowano 2016-09-21 22:25
Autor Wiadomość
Dexterowy
Temat założony przez niniejszego użytkownika
[C++] Rozdzial 34 Zad. 2
» 2015-12-30 00:25:36
C/C++
bool odczyt( string sciezka )
{
    ifstream plik;
    plik.open( sciezka.c_str() );
    if( !plik.good() )
         return false;
   
    int i = 0;
   
    while( !plik.eof() )
    {
        int suma = 0;
        bool check = true;
        i++;
        while( !czyNapotkanoZnakNowegoWiersza( plik ) || plik.eof() )
        {
            int liczba;
            char znak;
            plik >> liczba;
            if( plik.fail() )
            {
                plik.clear();
                plik >> znak;
                check = false;
            }
            else
            {
                suma += liczba;
            }
        }
        if( check == false )
             cout << "Bledne dane w wierszu nr " << i << endl;
        else
             cout << suma << endl;
       
    }
    return true;
}

Siemanko.
Problem z  tą funkcją mam taki, że działa jak należy jednak na ostatniej linijce w pliku się zapętla, niestety nie wiem czemu...

plik do odczytu:
1 2 3
3 4 a 5
3 2
5 2 2 1 3
# 3 4
P-142572
ninjadam
» 2015-12-30 16:47:42
W drugiej pętli while brakuje negacji przy plik.eof()
P-142595
Dexterowy
Temat założony przez niniejszego użytkownika
Nope.
» 2015-12-30 17:50:10
Niestety, nic to nie daje a nawet nie wczytuje nawet tych 4 linii, zapętla się na samym początku. :/
P-142597
BykWojtek
Chyba to ma być tak
» 2015-12-31 12:56:36
Jak wyżej ktoś pisał brakuje negacji plik.eof() i w tej samej linijce zamiast znaku '||' musi być znak '&&'.
P-142629
jundymek
» 2016-08-22 15:18:07
Co może być przyczyną, że otrzymuję wynik w takiej formie?:
0x6afdc00x6afdc00x6afdc06
0x6afdc00x6afdc00x6afdc00x6afdc0Bledne dane w wierszu: 2
0x6afdc00x6afdc05
0x6afdc00x6afdc00x6afdc00x6afdc00x6afdc013
0x6afdc00x6afdc00x6afdc0Bledne dane w wierszu: 5

Kod:
C/C++
bool sprawdz_linie( string dane )
{
    ifstream fin( dane.c_str() );
    string line;
    if( !fin.good() )
         return false;
   
    int wiersz = 0;
    while( !fin.eof() )
    {
        int suma = 0;
        wiersz++;
        bool ok = true;
        while( !czyNapotkanoZnakNowegoWiersza( fin ) || fin.eof() )
        {
            int liczba;
            char znak;
            fin >> liczba;
            if( fin.fail() ) {
                fin.clear();
                fin >> znak;
                ok = false;
            }
            else
            {
                suma += liczba;
            }
        } if( ok == false )
             cout << "Bledne dane w wierszu: " << wiersz << endl;
        else
             cout << suma << endl;
       
    }
    return true;
}

EDIT: Już doszedłem gdzie popełniłem błąd. W funkcji czyNapotkanoZnakNowegoWiersza wpisałem
cout << dane.get( cZnak );
.
P-151028
alloyZ
Rozdział 34 Zadanie 2 [trudne] - niekończąca się pętla || o jedną linie za daleko
» 2016-09-19 20:23:42
Cześć,

słuchajcie, kombinuje z zadaniem 2 z rozdziału 34 i mam taki problem - poniższy kod przedstawia moje wypociny i jeśli uruchomię go tak jak jest to wyświetla mi wszystko jak oczekuję (czyli 5 linii jak w pliku txt), ale pętla się nie zakańcza i muszę wychodzić poprzez ctrl+c. Natomiast jeśli usunę komentarz z argumentów drugiej funkcji WHILE z funkcji czyNapotkanoZnakNowegoWiersza pętla się zakańcza i wszystko jest PRAWIE ok lecz wyświetla mi informację o sumie z linii 6... a w pliku mam linii tylko 5. Zatem coś mi umyka i tu prośba do Was - oświećcie mnie co przeoczyłem.

MOJ KOD:

#include <iostream>
#include <string>
#include <fstream>


bool czyNapotkanoZnakNowegoWiersza( std::ifstream & plik )
{
    char cZnak;
    for(;; ) //nieskończona pętla
    {
        plik.clear();
        cZnak = plik.peek(); //sprawdzamy jaki kolejny znak zostanie zwrócony przez operację odczytu
        if( plik.fail() || plik.bad() )
             return false; //wystąpił błąd odczytu danych

        if( !isspace( cZnak ) )
             return false; //pobrany znak nie jest białym znakiem

        plik.get( cZnak ); //odczytujemy biały znak z pliku
        if( plik.fail() || plik.bad() )
             return false; //wystąpił błąd odczytu danych

        if( cZnak == '\n' )
             return true;

    } //for
}


void wczytaj(std::ifstream &plik, int iLiczba, char cZnak)
{
    plik.clear();
    int i=1;
    bool ok;
    int suma;

    while(!plik.eof())
    {
        ok=true;
        suma=0;
        while(!czyNapotkanoZnakNowegoWiersza(plik)/*&&!plik.eof()*/)
        {
            plik.clear();
            plik>>iLiczba;
            if(plik.fail())
            {
                plik.clear();
                plik>>cZnak;
                ok=false;
            }else
            suma+=iLiczba;
        }

        if(ok==false)
            std::cout<<"Bledne dane w linii "<<i<<std::endl;
        else
            std::cout<<"Suma w linii "<<i<<" = "<<suma<<std::endl;
        ++i;
    }
}


bool wczytajPlik(std::string sNazwaPliku)
{
    int iLiczba;
    char cZnak;
    //std::string linia[10];
    std::ifstream plik;
    plik.open(sNazwaPliku.c_str());

    if(!plik.good())
    {
        std::cout<<"Otwarcie pliku zakonczone niepowodzeniem";
        return false;
    }else
    std::cout<<"Plik OK"<<std::endl;

    wczytaj(plik, iLiczba, cZnak);


    plik.close();
    std::cout<<"Plik zamkniety";
    return true;
}

int main()
{
    int iLiczba;
    char cZnak;

    wczytajPlik("31 Roz 34.txt");

    return 0;
}
P-151833
karambaHZP
» 2016-09-19 21:05:56
while( !plik.eof() )
To jest powód. EOF ustawia flagę dopiero gdy próbujesz odczytać z końca pliku.
Po wczytaniu piątej linii nadal EOF == false, następnie pętla robi kolejną rundę
i jest błąd odczytu (EOF), ale pętla i tak kończy obieg i dolicza kolejną inkrementację.

ps: oczywiście zależy to jak kończy się ostatnia linia.
P-151837
igawar
» 2016-09-21 20:47:58
karambaHZP to nie jest prawda co piszesz.
Program który napisał alloyZ zapętla się w funkcji "czyNapotkanoZnakNowegoWiersza"

Znak nowej linii kończący wiersz 5-ty spowoduje wykonanie instrukcji:
C/C++
if( ok == false )
     std::cout << "Bledne dane w linii " << i << std::endl;
else
     std::cout << "Suma w linii " << i << " = " << suma << std::endl;

++i;

i powrót nie do pętli while(!plik.eof())
ale do pętli  while(!czyNapotkanoZnakNowegoWiersza(plik)
z funkcji "czyNapotkanoZnakNowegoWiersza" nigdy nie wyjdzie (zapętli się) bo znak EOF nie jest badany.
Niech ktoś poprawi jak źle myślę.
P-151892
« 1 » 2
  Strona 1 z 2 Następna strona