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

Rozdział 34- zadanie 1. Integer czytany jako char.

Ostatnio zmodyfikowano 2017-12-05 21:19
Autor Wiadomość
krzychna
Temat założony przez niniejszego użytkownika
Rozdział 34- zadanie 1. Integer czytany jako char.
» 2017-12-05 18:25:24
Cześć,
z nieznanego mi powodu jedną z liczb mój program czyta jako char. Prosiłbym o pomoc w znalezieniu błędu. Z góry dziękuję.
Kod:
C/C++
#include "stdafx.h"
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <fstream>
using namespace std;

bool odczytajLiczbe( ifstream & plik, int & iLiczba, int & wynik )
{
    plik.clear();
    plik >> iLiczba;
    if( plik.bad() )
    {
        plik.close();
        return false;
    } //if
    if( plik.fail() )
    {
        return false;
    } //if
    cout << "Liczba = " << iLiczba << endl;
    wynik += iLiczba;
    return true;
}

bool odczytajZnak( ifstream & plik, char & cZnak )
{
    plik.clear();
    plik >> cZnak;
    if( plik.bad() )
    {
        return false;
    } //if
    if( plik.fail() )
    {
        return false;
    } //if
    cout << "Znak = " << cZnak << endl;
    return true;
}

bool odczytajplik( string & sciezka ) {
    cout << "Odczytaj plik" << endl;
    ifstream plik;
    int wynik = 0;
    plik.open( sciezka.c_str() );
    if( !plik.good() )
    {
        return false;
    } //if
    while( !plik.eof() )
    {
        int iLiczba;
        char cZnak;
        plik.clear();
        if( !odczytajLiczbe( plik, iLiczba, wynik ) && plik.bad() )
        {
            cout << "Bad liczba" << endl;
            return false;
        } //if
        if( !odczytajZnak( plik, cZnak ) )
        {
            if( plik.bad() )
            {
                cout << "Bad znak" << endl;
                return false;
            } //if
            cout << "Suma = " << wynik << endl;
            cout << "Koniec pliku" << endl;
            break;
        } //if
    } //while
    return true;
}

int main() {
   
    string sciezka = "C:/Users/Krzyniu/Documents/GitHub/Programs/pliki/liczby.txt";
    if( !odczytajplik( sciezka ) )
    {
        cout << "Nie udalo sie odczytac pliku" << endl;
    } //if
    cout << "Odczytano plik" << endl;
    //=============================
    system( "pause" );
    return 0;
   
}

Dane wejściowe:
a 1 2 321 ac.de ef#@g 5 #3
Dane wyjściowe:
C/C++
Odczytaj plik
Znak = a
Liczba = 1
Znak = 2
Liczba = 321
Znak = a
Znak = c
Znak =.
Znak = d
Znak = e
Znak = e
Znak = f
Znak = #
Znak = @
Znak = g
Liczba = 5
Znak = #
Liczba = 3
Suma = 330
Koniec pliku
Odczytano plik

Co więcej gdy wprowadzę takie dane wejściowe:
a 1 321 ac.de ef#@g 5 #3
Otrzymuję taką odpowiedź:
C/C++
Odczytaj plik
Znak = a
Liczba = 1
Znak = 3
Liczba = 21
Znak = a
Znak = c
Znak =.
Znak = d
Znak = e
Znak = e
Znak = f
Znak = #
Znak = @
Znak = g
Liczba = 5
Znak = #
Liczba = 3
Suma = 30
Koniec pliku
Odczytano plik
P-167580
pekfos
» 2017-12-05 19:49:53
Zawsze próbujesz wczytać znak.
P-167591
krzychna
Temat założony przez niniejszego użytkownika
» 2017-12-05 21:19:47
Poprawiłem, działa - jeżeli coś jest niezgodnie z sztuką to proszę o krytykę :)
C/C++
#include "stdafx.h"
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <fstream>
using namespace std;

bool odczytajLiczbe( ifstream & plik, int & iLiczba, int & wynik )
{
    plik.clear();
    plik >> iLiczba;
    if( plik.bad() )
    {
        plik.close();
        return false;
    } //if
    if( plik.fail() )
    {
        return false;
    } //if
    cout << "Liczba = " << iLiczba << endl;
    wynik += iLiczba;
    return true;
}

bool odczytajZnak( ifstream & plik, char & cZnak )
{
    plik.clear();
    plik >> cZnak;
    if( plik.bad() )
    {
        return false;
    } //if
    if( plik.fail() )
    {
        return false;
    } //if
    cout << "Znak = " << cZnak << endl;
    return true;
}

bool odczytajplik( string & sciezka ) {
    cout << "Odczytaj plik" << endl;
    ifstream plik;
    int wynik = 0;
    plik.open( sciezka.c_str() );
    if( !plik.good() )
    {
        return false;
    } //if
    while( !plik.eof() )
    {
        int iLiczba;
        char cZnak;
        plik.clear();
        if( !odczytajLiczbe( plik, iLiczba, wynik ) && plik.bad() )
        {
            cout << "Bad liczba" << endl;
            return false;
        } //if
        if( plik.fail() &&!odczytajZnak( plik, cZnak ) )
        {
            if( plik.bad() )
            {
                cout << "Bad znak" << endl;
                return false;
            } //if
            break;
        } //if
    } //while
    cout << "Suma = " << wynik << endl;
    cout << "Koniec pliku" << endl;
    return true;
}

int main() {
   
    string sciezka = "C:/Users/Krzyniu/Documents/GitHub/Programs/pliki/liczby.txt";
    if( !odczytajplik( sciezka ) )
    {
        cout << "Nie udalo sie odczytac pliku" << endl;
    } //if
    cout << "Odczytano plik" << endl;
    //=============================
    system( "pause" );
    return 0;
   
}
P-167612
« 1 »
  Strona 1 z 1