2010-10-11 4 views
0

Cela semble me donner un peu de problème. Cette méthode est supposée générer un nombre aléatoire et l'affecter à un caractère. getline récupère la chaîne entière du fichier texte et l'assigne aux aliments. y a pour but de maintenir l'endroit où il trouve c dans la chaîne des aliments. Il va ensuite utiliser ce int pour effacer de la chaîne et imprimer ce qui reste.Méthodes de manipulation de chaîne donnant l'erreur RunTime

Je reçois toujours un "programme a demandé de fermer en raison d'une erreur d'exécution d'une manière inhabituelle" et il se bloque. Merci d'avance.

void feedRandomFood() 
    { 
     int y = 0; 
     int x = rand() % food.size() + 1; //assigns x a random number between 1 and food.size MAX 
     char c = '0' + x; //converts int to char for delimiter char. 
     ifstream inFile; 
     inFile.open("OatmealFood.txt", ios::in); 
     string foods = ""; 
     getline(inFile, foods); 
     inFile.close(); 
     y = foods.find(c); 
     foods.erase(y); //erase characters up to the char found 
     cout << foods; 
    } 

Répondre

0

Essayez:

Notez que foods.erase (y) effacera les caractères de 'f' avant. Si vous voulez effacer les caractères à « f », lisez cet exemple:

Voici un exemple simple de comment effacer les caractères:

string x = "abcdefghijk"; 
    // find the first occurrence of 'f' in the string 
    int loc = x.find('f'); 

    // erase all the characters up to and including the f 
    while(loc >= 0) { 
    x.erase(x.begin()+loc); 
    --loc; 
    } 
    cout<<x<<endl; 

sortie du programme:

---------- Capture Output ---------- 
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe 
ghijk 

> Terminated with exit code 0. 

Donc, pour votre exemple, vous avez besoin quelque chose comme ceci:

while(y >= 0) { 
    foods.erase(foods.begin() + y); 
    --y; 
} 

EDIT Vous pouvez également éliminer la boucle while et il suffit d'appeler la surcharge erase, comme ceci:

string x = "abcdefghijk"; 
    int loc = x.find('f'); 
    if (loc >= 0) { 
    x.erase(x.begin(),x.begin()+loc+1); 
    cout<<x<<endl; 
    } 

sortie du programme:

---------- Capture Output ---------- 
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe 
ghijk 

> Terminated with exit code 0. 
+0

AH! J'ai oublié d'utiliser les boucles while, je viens d'apprendre comment utiliser les manipulations de chaînes, donc je faisais .erase(); –

2

si la méthode find ne trouve pas c dans la chaîne foods ? Il renvoie npos et lorsque vous l'utilisez dans erase votre programme souffle.

Vous avez donc besoin d'ajouter cette vérification avant de faire un erase:

y = foods.find(c); 
if(y != string::npos) { 
    foods.erase(y); 
} 

Aussi, vous devez toujours vous assurer que le fichier open réussi avant d'essayer de lire une ligne de celui-ci.

inFile.open("OatmealFood.txt", ios::in); 
if(!inFile.is_open()) { 
    // open failed..take necessary steps. 
} 
+0

La valeur de 'npos' ne peut jamais être' -1', pour la simple raison que 'npos' est non signé. Au lieu de cela, 'npos 'a une valeur extrêmement grande (probablement 2^32 -1) –

+0

@Bart: http://www.cplusplus.com/reference/string/string/npos/ – codaddict

+0

Notez le type:' size_t' est non signé . –

1

Je ne peux pas commenter la solution ci-dessus de dcp (postes pas encore assez), par pourquoi ne pas utiliser les autres méthodes d'effacement sont disponibles? Pourquoi avez-vous besoin d'une boucle while?

vous pouvez simplement appeler:

foods.erase (0, loc);

(pouvez-vous pas?)