0
votes

Comment obtenir les entiers entiers à partir du fichier a des chaînes et des entiers et les stocker dans un tableau en C ++?

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;
    }
}


2 commentaires

À 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.


3 Réponses :


0
votes

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?


0 commentaires

0
votes

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


0 commentaires

0
votes

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 ++).


1 commentaires

Merci! C'est la solution que je cherchais!