Считать целые числа из текстового файла в двумерный массив и оценить длину - PullRequest
0 голосов
/ 21 февраля 2020

Мне нужно прочитать целые числа из текстового файла в двумерный массив.

-1 указывает конец массива. Каждый массив должен иметь 6 положительных целых чисел (-1 НЕ считается частью массива).

Например, если мой текстовый файл содержит следующие целые числа:

1 3 4 6 1 7 -1 1 3 5 7 2 3 -1 2 5 7 2 6 3 -1

Это означает, что когда в программу будут прочитаны эти целые числа, будет 3 массива:

1st Array : 1 3 4 6 1 7

2-й массив: 1 3 5 7 2 3

3-й массив: 2 5 7 2 6 3

Я написал программу для оценки, если каждый массив имеет правильную длину (6 целых) и правильные целые числа (все целые числа должны быть положительными) и выводит соответствующие сообщения об ошибках, если эти критерии не выполнены.

#include <iostream>
#include  <fstream>
#include <string>
#define MAX_ROWS  3
#define MAX_COLUMNS 2

using namespace std;

int main()
{
    string fileName = "testdata.txt";                                                           //declare a string to store the Input File's name 
    ifstream inFile;                                                                             //name the input file connection 
    inFile.open(fileName);                                                                       //open the Input File
    string errorMessage = "Input file cannot be found";                                           //Declare a string to store an error message, just in case the Input file doesn't exist or cannot be found

    if (!inFile) {                                                                               //If the Input File doesn't not exist, then display the error message
        cout << errorMessage << '\n';                                                           //also store the error message to the Output file
        system("pause");
        return  0;                                                                               //end the program if the Input File does not exist
    }


    int checkNbr;
    int ArrB[MAX_ROWS][MAX_COLUMNS];
    int size = MAX_ROWS * MAX_COLUMNS;
    bool bad = false;
    bool invalidnum = false;

while (!inFile.eof())      
    {
        for (int i = 0; i < MAX_ROWS;i++) {
            for (int j = 0; j < MAX_COLUMNS; j++) {
                inFile >> ArrB[i][j];
                if (ArrB[i][j] == -1) {
                    bad = true;
                    cout << "\nThe array does not have enough integers" << endl;
                    break;
                    //return 1;
                }
                else {
                    if (ArrB[i][j] < 1) {
                        invalidnum = true;
                    }
                }
                cout << *(*(ArrB + i) + j) << " ";

            }
        }

        if (invalidnum == true) {
            invalidnum = false;
            cout << "\nThere is/are negative number(s) or zero(s) in the array imported from your text file.\n";
        }

        if (bad == false) {
            inFile >> checkNbr;
            if (checkNbr == -1) {
                cout << "\nThe size of the array is correct." << endl;
            }
            else {

                while (checkNbr != -1)
                {
                    cout << checkNbr;
                    cout << " ";
                    inFile >> checkNbr;

                }

                cout << "\nYou have too many numbers in this array\n";
            }
        }
    }

    return 0;
}

Если я запускаю свою программу:

Случай 1 - ПРОЙДЕН

1 2 3 4 5 6 -1 3 5 2 1 6 8 3 2 5 -1 3 3 5 6 7 5 -1

enter image description here

Случай 2 - ПРОЙДЕН

1 2 3 4 5 -6 -1 3 -5 2 1 6 8 -1 3 5 6 7 5 -1

enter image description here

Случай 3 - СБОЙ (!)

1 2 3 4 -1 1 2 3 4 5 6 7 8 -1 1 2 3 4 5 -1

enter image description here

Как видите, случай 3 не удался. Второй массив (1 2 3 4 5 6 7 8) на самом деле длиннее объявленного размера массива, но выводит сообщение об ошибке «В массиве недостаточно целых чисел»… ..

ТОЛЬКО раз Программа не будет работать, если в первом массиве недостаточно целых чисел.

Будем благодарны за любые комментарии или советы!

1 Ответ

1 голос
/ 22 февраля 2020

Проблема

bad не сбрасывается после ее обработки.

Решение

Переместите bool bad = false; в тело while (!inFile.eof()) l oop, чтобы оно сбрасывается при каждой итерации. Если вы определяете переменные с максимально узкой областью действия, вы обычно можете избежать этой проблемы, поэтому вам настоятельно рекомендуется сделать то же самое с остальными вашими переменными.

Это решит проблему, о которой было сказано, и, по крайней мере, еще одна ошибка, которую вы еще не нашли. Это оставляет по крайней мере еще две нерешенные ошибки, которые вы должны устранить, и обе они были рассмотрены в комментариях вопроса.

TL; версия DR

Быстрый просмотр ввода 1 2 3 4 -1 1 2 3 4 5 6 7 8 -1 1 2 3 4 5 -1

1 2 3 4 -1 анализируется и определяется как bad, поэтому для bad установлено значение true, и тестирование слишком длинного значения и очистки пропускается. Файл не закончился, поэтому программа зацикливается и начинает чтение следующего массива.

оставшийся ввод:

1 2 3 4 5 6 7 8 -1 1 2 3 4 5 -1

вывод на данный момент:

1 2 3 4 
The array does not have enough integers

1 2 3 4 5 6 разобрано. Это заполняет массив и цикл for завершается. bad по-прежнему true, поэтому проверка на переполнение пропускается, и сообщение не печатается .

Осталось ввода:

7 8 -1 1 2 3 4 5 -1

вывод пока:

1 2 3 4 
The array does not have enough integers
1 2 3 4 5 6

Теперь 7 8 -1 анализируется. Это слишком короткий, чтобы быть массивом и сообщать. Обратите внимание на то, что это делает с выходом.

Осталось ввода:

1 2 3 4 5 -1

Вывод пока:

1 2 3 4 
The array does not have enough integers
1 2 3 4 5 6 7 8 
The array does not have enough integers

Упс. Похоже, 1 2 3 4 5 6 7 8, а не просто 7 8, было слишком коротким.

Затем программа анализирует 1 2 3 4 5 и находит его слишком коротким.

Осталось ввода:

 

вывод на данный момент:

1 2 3 4 
The array does not have enough integers
1 2 3 4 5 6 7 8 
The array does not have enough integers
1 2 3 4 5 
The array does not have enough integers
...