Как получить целые числа из файла, есть строки и целые числа и сохранить их в массив в C ++? - PullRequest
0 голосов
/ 10 октября 2019

Я хочу получить целые числа из файла, в котором тоже есть строки, и сохранить их в массиве для выполнения каких-либо операций с ними. целые числа могут быть 1 или 12 или 234, поэтому 3 цифры. Я пытаюсь сделать это, но вывод останавливается, когда я запускаю код

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 ]

0 голосов
/ 10 октября 2019

Сначала вам нужно будет добавить функциональность get() внутри цикла, чтобы достичь конца файла.

Далее попробуйте добавить цикл while, когда char окажется целым числомпродолжить запрашивать следующий символ.

например

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 голосов
/ 10 октября 2019

Вы должны иметь дело с количеством цифр найденного числа:

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

Если вы хотите прочитать число с неопределенным размером, вам придется выделить память для форматирования каждой цифры чисел с помощьюnew (c ++) или malloc (c / c ++).

0 голосов
/ 10 октября 2019

Первое наблюдение: вы перебираете границы массива:

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

20 элементов и 21 итерация. Это неопределенное поведение, так что все возможно здесь (если ваша программа в конечном итоге попадет сюда).

Далее, вы читаете из файла один раз, а затем у вас есть бесконечный цикл, потому что выражение !file1.eof() либо истинно, либоfalse для остальной части программы. Разве это не причина «остановки вывода»?

Третий вывод: ваши if операторы бесполезны из-за точки с запятой после оператора:

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

Вы просто присваиваете digits[n]=contents; без каких-либо проверок.

Я также не вижу причин для указания ссылки на char в функции. Почему бы не сделать его локальной переменной?

...