Je veux obtenir des entiers à partir d'un fichier qui a aussi des chaînes, et les stocker dans un tableau pour faire des opérations sur eux. les entiers peuvent être 1 ou 12 ou 234, donc 3 chiffres. J'essaie de le faire mais la sortie s'arrête lorsque j'exécute le code
void GetNumFromFile (ifstream &file1, char & contents) { int digits[20]; file1.get(contents); while(!file1.eof()) { for (int n = 0; n < 10; n++) { if(('0' <= contents && contents <= '9') && ('0' >= contents+1 && contents+1 > '9')); digits[n]=contents; if(('0' <= contents && contents <= '9') && ('0' <= contents+1 && contents+1 < '9')); digits[n]=contents; if(('0' <= contents && contents <= '9') && ('0' <= contents+1 && contents+1 <= '9') && ('0' <= contents+2 && contents+2 < '9')); digits[n]=contents; } continue; } for (int i = 0; i <= 20; i++) { cout << *(digits + i) << endl; } }
3 Réponses :
Première observation: vous itérez en dehors des limites du tableau:
if(('0' <= contents && contents <= '9') && ('0' >= contents+1 && contents+1 > '9')); digits[n]=contents;
20 éléments et 21 itérations. C'est un comportement indéfini, donc tout est possible ici (si votre programme arrive finalement ici).
Ensuite, vous lisez un fichier une fois et vous avez une boucle infinie car l'expression ! File1. eof ()
est soit vrai soit faux pour le reste du programme exécuté. N'est-ce pas la raison des "arrêts de sortie"?
La troisième constatation: vos instructions if
sont inutiles à cause du point-virgule après l'instruction:
int digits[20]; for (int i = 0; i <= 20; i++)
Vous attribuez simplement digits [n] = contents;
sans aucune vérification.
Je ne vois aucune raison de fournir une référence à char dans la fonction . Pourquoi ne pas en faire une variable locale?
Vous devrez d'abord ajouter la fonctionnalité get ()
à l'intérieur de la boucle afin d'atteindre la fin du fichier.
De plus, essayez d'ajouter une boucle while une fois un char s'est avéré être un entier pour continuer à demander le caractère suivant.
par exemple
int digits[20]; int i = 0; ifstream file1("filepath"); char contents; while (!file1.eof()) { file1.get(contents); // get the next character if (contents <= '9' && contents >= '0' && i < 20) // if character is in number range { digits[i++] = contents - '0'; // converting the chat to the right integer file1.get(contents); while (contents <= '9' && contents >= '0' && i < 20) // while is integer continue on { digits[i++] = contents - '0'; file1.get(contents); } } } // do other stuff here
Vous devez gérer le nombre de chiffres du numéro trouvé:
int digits[20]; int i = 0; short int aux[3]; // to format each digit of the numbers ifstream file1("filepath"); char contents; file1.get(contents); //first char if (!file1.eof()) //test if you have only one char in the file { while (!file1.eof() && i < 20) // limit added to read only 20 numbers { if (contents <= '9' && contents >= '0') // if character is in number range { aux[0] = contents - '0'; // converting the char to the right integer file1.get(contents); if (contents <= '9' && contents >= '0') // if contents is number, continue on { aux[1] = contents - '0'; if (!file1.eof()) // if has mor char to read, continue on { file1.get(contents); if (contents <= '9' && contents >= '0') // if is integer, continue on { aux[2] = contents - '0'; file1.get(contents); // will read same of last char if eof, but will have no effect at all //aux[0] *= 100; // define houndred //aux[1] *= 10; // define ten digits[i++] = (aux[0] * 100) + (aux[1] * 10) + aux[2]; } else { //aux[0] *= 10; // define ten digits[i++] = (aux[0] * 10) + aux[1]; } } else { digits[i++] = (aux[0] * 10) + aux[1]; } } else { digits[i++] = aux[0]; } } } } else if (contents <= '9' && contents >= '0' && i < 20) // check if the only one char is number { digits[i++} = contents - '0'; }
Si vous voulez lire un numéro de taille indéfinie, vous devrez allouer de la mémoire pour formater chaque chiffre du numers avec new (c ++) ou malloc (c / c ++).
Merci! C'est la solution que je cherchais!
À quoi ressemble réellement le fichier et avec quoi avez-vous des problèmes exactement? Veuillez être plus précis. De plus, vos instructions
if
contiennent des;
erronés. Consultez également Pourquoi iostream :: eof dans une condition de boucle est-il considéré comme incorrect? .Votre code contient tellement d'erreurs que votre meilleure prochaine étape pourrait être de faites du débogage par vous-même. Une fois que vous voyez les problèmes plus spécifiques, voyez s'ils sont déjà résolus sur SO et demandez une solution s'ils ne le sont pas.