2017-09-27 4 views
0

Je n'arrive pas à comprendre pourquoi mon programme plante. Lorsque je supprime la boucle while sous "// Affiche les options de nom" Le programme fonctionne correctement. Le code compile sur GCC sans avertissement. Pourrait-il être mon compilateur? Est-ce que cela a quelque chose à voir avec fstream? L'aide serait appréciée.Comment cette boucle bloque-t-elle mon programme?

Oh oui. Si vous vous demandez ce programme va lire data.txt et charger les données appropriées à une instance de la fonction du lecteur. Il est dans un état incomplet pour le moment.

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 
#define cls system("cls"); 

bool Pload = false; 

void menu(); 

struct player { 
    int Px, Py, life = 20; 
    string name = ""; 
}; 

main() { 
    menu(); 
} 

void menu() { 
    string cLine,names,input; 

    int x,i,lineNum = 0; 
    fstream data; 

    menu: 

    data.open("data.txt"); 
    //Gets list of all names in data.txt, Adds them to string names 
    while(data.good()) { 
     getline(data,cLine); 
    if(cLine[0] == '/') { 
     names += cLine; 
    } 
}   
names += '\n'; 

//Displays name options 
cls 
cout << "Welcome to W A L K.\n\nWhat is your name?\n"; 
while(names[i] != '\n') 
{ 
    cout << i; 
    if(names[i] == '/') {cout << endl;i++;} else {cout << names[i];i++;} 
} 
cout << endl; 
getline(cin,input); 

//checks if name exits and loads file data into player/world objects 
data.close(); 
data.open("data.txt"); 
while(data.good()) { 
    lineNum++; 
    getline(data,cLine); 
    if(cLine.erase(0,1) == input) { 
     cls cout << "Found Name" << endl; 
     getline(cin, input); 

     } 

    } 
//Restarts menu 
data.close(); 
goto menu; 
} 

donnees.txt

/Sammy 
x:0 
y:0 
l:20 
\ 

/Mary 
x:7 
y:9 
l:20 
\ 


/Dill 
x:7 
y:9 
l:20 
\ 

/Jack 
x:7 
y:9 
l:20 
\ 

Répondre

3

En utilisant votre débogueur aurait découvert cela, ou en utilisant simplement quelques cout déclarations.

Lorsque vous déclarez i de la manière suivante:

int x,i,lineNum = 0; 

Vous déclarez 3 int et initialisez lineNum-0; Cependant, les deux autres restent unitalisés, et donc il est un comportement indéfini pour les utiliser.

while(names[i] != '\n') // UB, i is unitialised 

Préférez de déclarer une variable et initialisez par ligne, comme ceci:

auto x = 0; 
auto i = 0; 
auto lineNum = 0; 

L'utilisation de auto vous oblige aussi à les initialiser à une valeur.

Si vous voulez écrire sur une seule ligne, vous devriez écrire

auto x = 0, i = 0, lineNum = 0; 

Mais il est pas aussi lisible et ne vous remercieront.

+0

Wow, ça m'a vraiment aidé. Je voterais mais c'est une de mes premières questions. Je vous remercie. –