Come ottenere gli interi numeri interi da file ha stringhe e numeri interi e memorizzarli in una matrice in C ++?

voti
0

Voglio ottenere interi da file con le stringhe troppo, e memorizzarli in una matrice di fare qualche operazione su di essi. gli interi possono essere 1 o 12 o 234, in modo da 3 cifre. Sto cercando di farlo, ma l'uscita si ferma quando eseguo il codice

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

}
È pubblicato 10/10/2019 alle 01:02
fonte dall'utente
In altre lingue...                            


3 risposte

voti
0

Hai a che fare con il numero di cifre del numero trovato:

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

while (!file1.eof())
{
    if (contents <= '9' && contents >= '0' && i < 20) // 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' && i < 20) && !file1.eof()) // if is integer and has mor char to read, continue on
        {
            aux[1] = contents - '0';
            file1.get(contents);
            if ((contents <= '9' && contents >= '0' && i < 20) && !file1.eof()) // if is integer and has mor char to read, continue on
            {
                aux[2] = contents - '0';
                file1.get(contents);
                aux[0] *= 100; // define houndred
                aux[1] *= 10; // define ten
                digits[i++] = aux[0] + aux[1] + aux[2];

            }
            else
            {
                aux[0] *= 10; // define ten
                digits[i++] = aux[0] + aux[1];
            }
        }
        else
        {
            digits[i++] = aux[0];
        }
    }
    i++;
}

Se volete leggere un numero di dimensioni non definita, allora si dovrà allocare memoria per formattare ogni cifra dei numers con il nuovo (c ++) o malloc (C / C ++).

Risposto il 10/10/2019 a 05:06
fonte dall'utente

voti
0

Sarà necessario prima di aggiungere get()funzionalità all'interno del ciclo, nonché al fine di raggiungere la fine del file.

Forthmore provare ad aggiungere un ciclo while una volta charè risultato essere un numero intero di continuare a chiedere il carattere successivo.

per esempio

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
Risposto il 10/10/2019 a 02:29
fonte dall'utente

voti
0

Prima osservazione: eseguire iterazioni fuori limiti della matrice:

int digits[20];
for (int i = 0; i <= 20; i++)

20 elementi e 21 iterazione. Questo è un comportamento indefinito, quindi tutto è possibile qui (se il vostro programma alla fine ottiene qui).

Successivamente, è leggere dal file una volta e poi si dispone di un ciclo infinito, perché l'espressione !file1.eof()è true o false per il resto della esecuzione del programma. Non è che il motivo di "fermate" in uscita?

La terza scoperta: le vostre ifdichiarazioni sono inutili a causa del punto e virgola dopo la dichiarazione:

if(('0' <= contents && contents <= '9') && ('0' >= contents+1 && contents+1 > '9'));
            digits[n]=contents;

Basta assegnare digits[n]=contents;senza alcun controllo.

I né visto alcun motivo di fornire un riferimento char nella funzione. Perché non renderlo una variabile locale?

Risposto il 10/10/2019 a 01:31
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more