Чтение квадратной матрицы из файла

141
22 мая 2019, 10:10

У меня имеется файл, в котором я записал квадратную матрицу через пробелы в виде

1 2 3
4 5 6
7 8 9

Я хочу посчитать количество элементов, потом взять корень и получить длину строки и столбца. В конечном счёте переменная count содержит 10, а не 9 как я предполагал.

ifstream file;
file.open("C:\\Users\\User\\Desktop\\A.txt");
if (!file.is_open()) 
{
    cout << "Файл не удалось открыть. Название некорректно.";
}
double temp;
int count = 0;
while (!file.eof())
{
    file >> temp;
    count++;
}

После я перехожу к заполнению массива элементами. Но после заполнения массив содержит мусор. Это продолжение кода

file.seekg(0, ios::beg);
file.clear();
int side = sqrt(count - 1);
int** A = new int*[side];
for (int i = 0; i < side; i++)
{
    A[i] = new int[side];
}
for (int i = 0; i < side; i++)
{
    for (int j = 0; j < side; j++)
    {
        file >> A[i][j];
    }
}
Answer 1

При использовании стандартных библиотек С и С++, цикл с предусловием "eof" - практически всегда ошибка. Состояние "eof" в С и С++ - это флаг успешности предыдущей операции чтения. Это состояние не устанавливается само по себе просто при достижении конца файла. Это состояние устанавливается тогда, когда вы выполните [неудачную] попытку чтения за пределами файла. Вот эта последняя неудачная попытка чтения и попадает в ваш счетчик.

То есть в С и С++ для того, чтобы получить состояние "eof" недостаточно просто дойти до конца файла, надо еще "удариться лбом" в этот конец файла.

Явная проверка "eof" обычно нужна только для постфактум-разборки причин ошибочных ситуаций, а для управления логикой процесса чтения явная проверка "eof" не нужна практически никогда

while (file >> temp)
  count++;

В остальном коде: поставьте вызов clear перед вызовом seekg.

Также режет глаз неоправданное использование плавающих типов данных для решения чисто целочисленных задач. Непонятно, почему для изначального подсчета вы используете чтение double temp;, когда далее фактически будет читаться целочисленная матрица.

READ ALSO
Удаление элемента по индексу в valarray

Удаление элемента по индексу в valarray

Подскажите пожалуйста, можно ли как-нибудь реализовать удаление элемента по индексу с контейнера valarray?

133
Множественное наследование в с++

Множественное наследование в с++

Прохожу курс и застрял на задаче, которую в упор не могу понятьНиже само задание, которое не нужно решать

155
#define с++ для чего служит

#define с++ для чего служит

например код:

180