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

zapis/odczyt z pliku tekstowego

Ostatnio zmodyfikowano 2017-11-15 17:16
Autor Wiadomość
Bunzio
Temat założony przez niniejszego użytkownika
zapis/odczyt z pliku tekstowego
» 2017-11-14 18:30:15
Witam, męczę się już z tym problemem od kilku dni a mianowicie napisałem grę oraz jedną z funkcji miały być statystyki. Zapis do pliku odbywa się prawidłowo natomiast problem pojawia się przy wypisaniu danych z pliku na monitor, wyświetlają się podwójnie.
 


C/C++
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <Windows.h>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <string>
using namespace std;
string nick;
int attempts = 0;
void statsave()
{
    fstream statystyki;
    statystyki.open( "statystyki.txt", ios::out | ios::app );
    statystyki << nick << endl;
    statystyki << attempts << endl;
    statystyki.close();
}
void statread()
{
    fstream statystyki;
    statystyki.open( "statystyki.txt", ios::in );
    if( statystyki.good() == false )
    {
        cout << "Blad wczytywania.";
        statystyki.close();
    }
    string linia;
    int nrlini1 = 1;
    int nr_lini = 1;
    cout << " STATYSTYKI\n";
    while( getline( statystyki, linia ) )
    {
        if( nr_lini > 2 )
             nr_lini = 1;
       
        switch( nr_lini )
        {
        case 1: nick = linia; break;
        case 2: attempts = atoi( linia.c_str() ); break;
        }
        cout << nrlini1 << ".Nick: " << nick << " Proby: " << attempts << endl;
        nr_lini++;
        nrlini1++;
       
    }
    statystyki.close();
}
void game()
{
    srand( time( NULL ) );
    int number =( rand() % 1001 ) + 1;
    //cout << "Wylosowana liczba: " << number << std::endl; //do testów
    int guess = 0;
    cout << "Podaj swoj nick: ";
    cin >> nick;
    cout << "Wylosowano liczbe z przedzialu od 1 do 1000\n";
    while( number != guess )
    {
        attempts++;
        cout << "Aby zakonczyc dzialanie programu zgadnij liczbe: ";
        cin >> guess;
        if( guess > number )
             cout << "Podano zbyt duza liczbe" << endl;
       
        if( guess < number )
             cout << "Podano zbyt mala liczbe" << endl;
       
    }
    cout << "\n\n\nBrawo zgadles liczbe !\n";
    cout << " Ilosc prob: " << attempts << endl;
    statsave();
}
int main()
{
    int chois;
    while( true )
    {
        cout << "Witaj w grze zgadnij liczbe by bunzio\n";
        cout << "_________________________________________\n\n";
        cout << "[1]Graj\n" << "[2]Statystyki\n" << "[3]Wyjscie\n";
        cin >> chois;
        switch( chois )
        {
        case 1: game(); break;
        case 2: statread(); break;
        case 3: exit( 0 ); break;
        }
        system( "PAUSE" );
        system( "cls" );
    }
    return 0;
}
P-166879
ParseThisCode
» 2017-11-14 19:15:58
Skoro co druga linia to ilość prób to po co Ci ten if i switch?

Można tak:
C/C++
std::string attempts;
while( getline( statystyki, nick ) )
{
    getline( statystyki, attempts );
    cout << nrlini1 << ".Nick: " << nick << " Proby: " << attempts << endl;
    nrlini1++;
   
}

A tutaj zamykasz plik, który nie istnieje. Poza tym dalej następuje próba odczytania pliku:
C/C++
if( statystyki.good() == false )
{
    cout << "Blad wczytywania.";
    statystyki.close();
}

Zrób tak:
C/C++
if( !statystyki ) // równoważne z tym co u Ciebie
{
    cout << " Blad wczytywania." << endl;
    return;
}

Brak zabezpieczenia przed wprowadzeniem liter/słów. Można tak:
C/C++
if( !cin.fail() )
P-166880
Bunzio
Temat założony przez niniejszego użytkownika
» 2017-11-15 17:16:31
Dzięki wielkie za uwagi i pomoc, można zamknąć.
P-166897
« 1 »
  Strona 1 z 1