Problemi con file di testo

di il
8 risposte

Problemi con file di testo

Salve, non capisco perché il mio programma riesce a leggere il numero dentro al file di testo ma non riesce a sovrascriverlo. Il file di testo l'ho rinominato come "best_score.txt" e al suo interno ho scritto 99999 giusto per avere un punteggio da rimpiazzare. Il gioco che viene proposto è indovinare un numero tra 0 e 249. Grazie in anticipo
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <vector>

void print_vector(std::vector<int> vector){
	for(int i = 0; i < vector.size(); i++){
		std::cout << vector[i] << "\t";
	}
	
	std::cout << std::endl;
	return;
}

void save_score(int size){
	std::fstream file("best_score.txt");
	int best_score;
	file >> best_score;
	std::cout << best_score << "   " << size << "\n\n\n\n\n\n\n\n\n\n\n\n";
	
	if(!file.is_open()){
		std::cout << "ERROR, try later." << std::endl;
		return;
	}
	
	if(size < best_score){
		std::cout << "NEW BEST SCORE: " << size << std::endl;
		file << size;
	}
	else{
		file << best_score;
	}
	
	return;
}

void play_game(){
	std::vector<int> guesses;
	int random = rand() % 250;
	std::cout << random << std::endl;
	std::cout << "Guess the number: ";
	
	while(true){
		int guess;
		std::cin >> guess;
		guesses.push_back(guess);
		
		if(guess == random){
			std::cout << "You win\n";
			break;
		}
		else if(guess < random){
			std::cout << "Too low\n";
		}
		else{
			std::cout << "Too high\n";
		}
	}
	
	
	save_score(guesses.size());
	std::cout << "Your guesses are:" << std::endl;
	print_vector(guesses);
	system("pause");
	system("cls");
}

int main(void){
	int choise;
	srand(time(NULL));
	
	do{
		std::cout << "MENU \n" << "0. Quit \n" << "1. Play Game \n";
		std::cin >> choise;
		std::cout << std::endl;
	
		switch(choise){
			case 0:
				std::cout << "Ok.(sad)";
				return 0;
			case 1:
				play_game();
				break;
		}
	}while(choise != 0);
	
std::cout << std::endl << std::endl;
system("pause");
}

8 Risposte

  • Re: Problemi con file di testo

    Ovvero? Cosa non funzionerebbe nel codice secondo te?
  • Re: Problemi con file di testo

    oregon ha scritto:


    Ovvero? Cosa non funzionerebbe nel codice secondo te?
    Non riesco a sovrascrivere il vecchio miglior punteggio (il 99999 contenuto nel file.txt) con il nuovo best score
  • Re: Problemi con file di testo

    Nella if devi riportare il puntatore del file all'inizio dopo la lettura
    
    	if (size < best_score) {
    		std::cout << "NEW BEST SCORE: " << size << std::endl;
    		file.seekg(0, std::ios::beg);
    		file << size << std::endl;
    	}
    
    e la else non serve, eliminala.

    Così aggiorni solo se il punteggio è minore del precedente. E' corretto?
  • Re: Problemi con file di testo

    oregon ha scritto:


    Nella if devi riportare il puntatore del file all'inizio dopo la lettura
    
    	if (size < best_score) {
    		std::cout << "NEW BEST SCORE: " << size << std::endl;
    		file.seekg(0, std::ios::beg);
    		file << size << std::endl;
    	}
    
    e la else non serve, eliminala.

    Così aggiorni solo se il punteggio è minore del precedente. E' corretto?
    Ho provato, ma non sovrascrive il numero, bensì manda a capo il precedente e scrive il nuovo su una nuova riga, io invece puntavo a sovrascrivere
  • Re: Problemi con file di testo

    E' semplicemente parte del precedente perché non viene sovrascritto completamente.

    Puoi aggiungere spazi
    file << size << std::endl << "       ";
    Oppure usi un file in input

    ifstream

    per leggere il valore e poi lo chiudi e lo apri con

    ofstream

    per scriverlo
  • Re: Problemi con file di testo

    Grazie mille, adesso funziona
    Nel caso servisse a qualcuno ecco il codice:
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <ctime>
    #include <vector>
    
    void print_vector(std::vector<int> vector){
    	for(int i = 0; i < vector.size(); i++){
    		std::cout << vector[i] << "\t";
    	}
    	
    	std::cout << std::endl;
    	return;
    }
    
    void save_score(int size){
    	std::ifstream input("best_score.txt");
    	int best_score;
    	input >> best_score;
    	
    	std::ofstream output("best_score.txt");
    	
    	if(!input.is_open()){
    		std::cout << "ERROR, try later." << std::endl;
    		return;
    	}
    	
    	if(size < best_score){
    		std::cout << "NEW BEST SCORE: " << size << std::endl;
    		output << size;
    	}
    	else{
    		output << best_score;
    	}
    	
    	return;
    }
    
    void play_game(){
    	std::vector<int> guesses;
    	int random = rand() % 250;
    	std::cout << random << std::endl;
    	std::cout << "Guess the number: ";
    	
    	while(true){
    		int guess;
    		std::cin >> guess;
    		guesses.push_back(guess);
    		
    		if(guess == random){
    			std::cout << "You win\n";
    			break;
    		}
    		else if(guess < random){
    			std::cout << "Too low\n";
    		}
    		else{
    			std::cout << "Too high\n";
    		}
    	}
    	
    	
    	save_score(guesses.size());
    	std::cout << "Your guesses are:" << std::endl;
    	print_vector(guesses);
    	system("pause");
    	system("cls");
    	
    	return;
    }
    
    int main(void){
    	int choise;
    	srand(time(NULL));
    	
    	do{
    		std::cout << "MENU \n" << "0. Quit \n" << "1. Play Game \n";
    		std::cin >> choise;
    		std::cout << std::endl;
    	
    		switch(choise){
    			case 0:
    				std::cout << "Ok.(sad)";
    				return 0;
    			case 1:
    				play_game();
    				break;
    		}
    	}while(choise != 0);
    	
    	std::cout << std::endl << std::endl;
    	system("pause");
    	return 0;
    }
  • Re: Problemi con file di testo

    Come ti ho detto prima la parte dell'else non serve
  • Re: Problemi con file di testo

    Ho provato a toglierla, ma se lo faccio il file di testo alla fine dell'esecuzione resta vuoto
Devi accedere o registrarti per scrivere nel forum
8 risposte