Programme seulement en boucle une fois

Le programme lit le texte d’un fichier d’entrée. Ma sortie est supposée lire:

Level Score Stars ---------------------------------- 1 3840 ** 2 5940 ** 3 11560 ** 4 18140 ** 5 18780 ** 

Les écanvass sont supposées correspondre au niveau.

Le programme n’affiche que la première ligne mais le programme est écrit pour que la boucle puisse afficher la sortie totale. Pour une raison quelconque, la boucle de programme ne parcourt que la première ligne de code.

Je ne comprends pas pourquoi le programme ne tourne pas en boucle plusieurs fois. Tout conseil serait utile.

 #include  #include  #include  #include using namespace std; int buildArrays(int A[],int B[],int C[]) { int i=0,num; ifstream inFile; inFile.open("candycrush.txt"); if(inFile.fail()) { cout<<"The candycrush.txt input file did not open"<>num; A[i]=num; inFile>>num; B[i]=num; inFile>>num; C[i]=num; i++; } inFile.close(); return i; } void printArrays( ssortingng reportTitle, int levelsArray[], int scoresArray[], int starsArray[], int numberOfLevels ) { cout<<endl; cout<<reportTitle<<endl; cout<<"Levels\tScores\tStars"<<endl; cout<<"---------------------"<<endl; for(int i=0;i<numberOfLevels;i++) { cout<<levelsArray[i]<<"\t"<<scoresArray[i]<<"\t"; for(int j=0;j<starsArray[j];j++) { cout<<"*"; } cout<<endl; } } void sortArrays( int levelsArray[], int scoresArray[], int starsArray[], int numberOfLevels ) { for(int i=0;i<numberOfLevels;i++) { for(int j=0;j<numberOfLevels;j++) { if(levelsArray[i]<levelsArray[j]) { int temp1=levelsArray[i]; int temp2=scoresArray[i]; int temp3=starsArray[i]; levelsArray[i]=levelsArray[j]; scoresArray[i]=scoresArray[j]; starsArray[i]=starsArray[j]; levelsArray[j]=temp1; scoresArray[j]=temp2; starsArray[j]=temp3; } } } } int main() { const int MAX=400; int levelsArray[MAX]; int scoresArray[MAX]; int starsArray[MAX]; int numberOfLevels=buildArrays(levelsArray,scoresArray,starsArray); printArrays( "Candy Crush UNSORTED Report", levelsArray, scoresArray, starsArray, numberOfLevels ); sortArrays( levelsArray, scoresArray, starsArray, numberOfLevels); printArrays( "Candy Crush SORTED Report", levelsArray, scoresArray, starsArray, numberOfLevels ); system("pause"); } 

Votre code envoyé fonctionne très bien – il y a probablement une erreur dans votre fichier candycrush.txt ou dans la lecture du fichier. Considérez l’extrait suivant:

 #include  #include  #include  #include  using namespace std; int buildArrays(int A[], int B[], int C[]){ int i=0,num; for(i=0;i<10;i++){ A[i] = 10-i; B[i] = 10-i; C[i] = 10-i; } return i; } void printArrays( string reportTitle, int levelsArray[], int scoresArray[], int starsArray[], int numberOfLevels ){ cout< 

Ce qui affichera correctement:

 Candy Crush UNSORTED Report Levels Scores Stars --------------------- 10 10 ********** 9 9 ********* 8 8 ******** 7 7 ******* 6 6 ****** 5 5 ***** 4 4 **** 3 3 *** 2 2 ** 1 1 * Candy Crush SORTED Report Levels Scores Stars --------------------- 1 1 * 2 2 ** 3 3 *** 4 4 **** 5 5 ***** 6 6 ****** 7 7 ******* 8 8 ******** 9 9 ********* 10 10 ********** 

Notez également quelques points: j'ai supprimé le #include et ajouté #include - sinon, il ne comstackra pas du tout (du moins sur ma plate-forme, win32 avec VS2012). Votre fonction printArrays() devrait starsArray[i] place, vous avez écrit starsArray[j] (où j est toujours égal à 0). Vous ne faites donc que sortir les écanvass du premier tableau. J'ai corrigé cela dans l'extrait de code fourni.

Votre fichier “candycrush.txt” contient un ou plusieurs * caractères dans la 3ème colonne, mais vous essayez de le lire sous forme d’entier. Ceci est bien sûr une erreur et l’état d’erreur du stream d’entrée est donc défini. Les lectures ultérieures à partir de ce stream échoueront dans cet état.

La solution est assez simple: il suffit de lire la dernière colonne comme une chaîne complète. Cela simplifiera également votre printArrays puisque vous n’aurez plus à compter le * ; il suffit de l’imprimer tel quel.

Voici votre buildArrays corrigé un peu avec une taille réelle afin qu’il ne soit pas envahi:

 template  int buildArrays(istream &is, int (&A)[maxsize], int (&B)[maxsize], std::ssortingng (&C)[maxsize]) { assert(is); size_t i; for(i = 0; i < maxsize && is; ++i) { is >> A[i] >> B[i] >> C[i]; } return i; } 

Votre main ouvre le fichier d’entrée et passe le ifstream dans buildArrays :

 int main() { const int MAX = 400; int levelsArray[MAX]; int scoresArray[MAX]; ssortingng starsArray[MAX]; ifstream infile("candycrush.txt"); int numberOfLevels = buildArrays(infile, levelsArray, scoresArray, starsArray); // and other stuff // ... }