Enregistrement d'un tableau dans un fichier

Fermé
hghada Messages postés 2 Date d'inscription vendredi 24 avril 2015 Statut Membre Dernière intervention 24 avril 2015 - Modifié par Whismeril le 25/04/2015 à 08:47
mamiemando Messages postés 33433 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 décembre 2024 - 8 mai 2015 à 00:47
Bonsoir, je suis entrain de programmer le jeux "mastermind "en application console , je veux mémoriser la combinaison choisit au hasard par la machine dans un fichier texte ... mais j'ai pas réussite à là faire... la combinaison se trouve dans le variable mm_combi ... voila mon code :
qu'est ce que vous me conseillée de faire ?????? :/


#include<iostream>
#include<stdio.h>
#include<ctime>
#include<cstdlib>
#include<conio.h>
using namespace std ;
#define maxcombi 4
#define maxcouleurs 6
#define maxessai 10
char mm_combi [maxcombi+1];
char mm_proposition [maxcombi+1];
unsigned i=1,j,k=0 ;
int n_bien_p=0,n_mall_p=0,pos=0;
FILE *fich;


void tirage_au_sort()
{
 fich=fopen("c:/fichier/projet.txt", "r");
unsigned a ;
srand(time(NULL));
for (i=0;i<maxcombi;i++)
{
a=rand()%(maxcouleurs) +1 ;
 switch (a)
 { case 1 :mm_combi[i]='r';
   break ;
  case 2 :mm_combi[i]='b';
   break ;
  case 3 :mm_combi[i]='v';
   break ;
  case 4 :mm_combi[i]='o';
   break ;
  case 5 :mm_combi[i]='j';
   break ;
  case 6 :mm_combi[i]='m';
   break ;
 };
}
fscanf(fich,"%s",mm_combi);
fprintf(fich,"%s",mm_combi);
fclose(fich);
}



void lecture_de_la_proposition (char tab[maxcombi+1])
{
 tab[4]='\0';
 
 cout << "\n\n\t\tVous allez donner votre proposition:\n"<< endl ;
 
 cin >> tab;
 if (tab[4]!='\0')
  cout<<"\n\tATTENTION ! vous devez entrer SEULLEMENT 4 caracteres !!"<<endl;

}


void calcule_de_score (char t[maxcombi+1],char p[maxcombi+1])
{

char ts[maxcombi+1]={"0000"};
char ts2[maxcombi+1]={"0000"};
n_bien_p=0;
n_mall_p=0;
pos=0;
 for (i=0;i<maxcombi;i++)                             
 for (j=0;j<maxcombi;j++)                            
  if(t[i]==p[j] && ts[i]== '0' && ts2[j]=='0' )      
  {                                                
  ts[i]++;
  ts2[j]++;
  n_bien_p++;
  j=maxcombi+1;
  };
n_mall_p = maxcombi - n_bien_p;
for (i=0;i<maxcombi;i++)
 if (t[i]==p[i])
  pos++;
cout <<"n_bien_p:\t"<<n_bien_p<<endl;
cout <<"n_mall_p:\t"<<n_mall_p<<endl;
cout <<"n_bien_pos:     "<<pos<<endl;

}


void main ()
{
do
{k=0;
 cout<<"\n\t\tBienvenu au MASTERMIND ,\n\n\n \tC'ent un jeux de reflexion dont voux devez decoder un code de 4 couleurs tirer parmi 6 en tappant les premiers lettres des couleurs \n \n\n\n \tLes couleurs sont les suivants:\n\n\t\tRouge\tVert\tBleu\tJaune\tMarron\tOranger \n \n \n\n \tREMARQUE :les lettres doivent entre tappees en miniscule sinon votre proposition est FAUSSE "<<endl;
 tirage_au_sort();

do
{if (k>=10)
 break;
lecture_de_la_proposition( mm_proposition);
calcule_de_score(mm_combi,mm_proposition);
k++;
}
while((n_bien_p != maxcombi) || ( pos!=maxcombi)) ;
if ((n_bien_p == maxcombi) && ( pos==maxcombi))
 cout<<"\n\n\n\t\tbravouuuuuuu, (Y) :) vous avez gagnez"<<endl;
else

 cout<<"\n\n\n\tdsl :/ , vous avez perdu  "<<endl;
cout<<"\n\n\tSi vous voulez rejouer encore une fois , merci de taper   1   :)\n\n "<<endl;
cin>>i;

}
while (i==1);
getch();
}


EDIT: Ajout de la coloration syntaxique.


A voir également:

1 réponse

mamiemando Messages postés 33433 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 décembre 2024 7 809
Modifié par mamiemando le 8/05/2015 à 00:47
Bon nous allons passer sur le code en lui-même qui contient beaucoup de choses qui ne vont pas du tout et nous centrer sur le problème en lui même, écrire une chaîne dans un fichier.

1) Comment écrire dans un fichier

L'exemple ci-dessous montre comment écrire un fichier proprement :

#include <iostream>
#include <fstream>

int main() {
  const char * filename = "toto.txt";
  std::ofstream ofs(filename);
  if (ofs) {
    ofs << "bonjour" << std::endl;
    ofs.close();
  } else {
    std::cerr << "Can't write in " << filename << std::endl;
  }
  return 0;
}


ofs
est ici un flux qui permet d'écrire dans un fichier comme si on écrivait dans
std::cout
, le flux de sortie standard. Il faut simplement contrôler qu'il est ouvert avec succès avant d'écrire dedans. Il faut veiller à le fermer (si et seulement si il a été ouvert avec succès) une fois qu'on a fini d'écrire dedans.

2) Pièges classiques dûs aux types

La seconde "difficulté" potentielle dans ton code, c'est va-t'on écrire ce qu'on veut ? Si ce sont les caractères associés à tes couleur que tu veux écrire, pas de problème.

Maintenant supposons que tu veuilles écrire les nombres correspondants à chaque couleur et que tu aies eu envie de les stocker dans des uint8_t. Pas de chance, en C++ un uint8_t est vu comme un char, et on n'affichera donc le caractère ASCII correspondant au lieu de la valeur numérique. Pour éviter ça, il faudrait donc caster l'uin8_t qu'on souhaite écrire (par exemple en uint16_t).

Exemple :

#include <iostream>
#include <cstdint>

int main() {
    uint8_t x = 117;
    std::cout << "x           = " << x           << std::endl
              << "uint16_t(x) = " << uint16_t(x) << std::endl;
    return 0;
}


... retourne :


x = u
uint16_t(x) = 117


Bonne chance
0