0

не понимаю в чём проблема. Пытаюсь считать данные из файла, считывается непонятно что.

Вот сам код: (ниже есть пример отладки кода, данных в файле и их чтения)

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void data_form(); // формирование массива данных на диске

int record_count(); // подсчёт числа чисел в файле

void load_database(int* l); // чтение массива

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

int main() { setlocale(LC_ALL, "ru");

data_form();
int m = record_count();
int* arr;
arr = new int[m];
load_database(arr);
for (int i = 0; i &lt; m; i++)
    cout &lt;&lt; *arr + i &lt;&lt; endl;
delete[] arr;

system(&quot;pause&quot;);
return 0;

}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// формирование массива данных на диске void data_form() { int m; cout << "Введите количество чисел для записи на диск: "; cin >> m; srand(time(NULL)); FILE* pf; if ((pf = fopen("DataBase.txt", "w+")) == NULL) perror("Error opening file!"); for (int i = 0; i < m; i++) fprintf(pf, "%d\n", rand()%21 - 20); fclose(pf); }

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// подсчёт числа чисел в файле int record_count() { int n = 0, k = 0; FILE* pf; if ((pf = fopen("DataBase.txt", "r")) == NULL) perror("Error opening file!"); while (!feof(pf) && !ferror(pf)) { fscanf(pf, "%d\n", &k); n++; } fclose(pf); return n; }

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// чтение массива void load_database(int* l) { FILE* pf; if ((pf = fopen("DataBase.txt", "r")) == NULL) perror("Error opening file!"); for (l; !feof(pf); l++) fscanf(pf, "%d\n", &l); fclose(pf); }

Отладка кода:

Введите количество чисел для записи на диск: 12

Что получается в файле

-16
-19
-16
-6
-7
-14
-20
-18
-1
-7
-1
-10


Что выводит код:

-842150451
-842150450
-842150449
-842150448
-842150447
-842150446
-842150445
-842150444
-842150443
-842150442
-842150441
-842150440
ps1v
  • 11
  • 3
  • 3
    fscanf(pf, "%d\n", &l); - неправильно. Так вы считываете значение не в элемент массива по указателю, а в саму переменную-указатель. Правильно: fscanf(pf, "%d\n", l); – LShadow77 May 27 '22 at 20:22
  • И ещё, cout << *arr + i << endl; - неправильно. Ну если вы не желаете выводить значение первого элемента массива плюс i. А если желаете выводить значение i-го элемента массива, то правильно так: cout << *(arr + i) << endl;. А ещё лучше так: cout << arr[i] << endl; – LShadow77 May 27 '22 at 20:27
  • И ещё-2. if ((pf = fopen("DataBase.txt", "w+")) == NULL) perror("Error opening file!");... и далее с чистой совестью пишете в файл, указатель на структуру которого (pf) может оказаться NULL. Правильно, например, так: if ((pf = fopen("DataBase.txt", "w+")) == NULL) {perror("Error opening file!"); exit(1);}. – LShadow77 May 27 '22 at 20:36
  • ... то же самое и при чтении из файла. Если fopen() возвратила NULL, нужно либо возвращать false (и возвращаемое значение проверять в вызывающем коде), либо аварийно завершать работу программы. – LShadow77 May 27 '22 at 20:44
  • 2
    И добью последний гвоздь — у вас будет неверно работать проверка feof() — см. https://ru.stackoverflow.com/q/833980/195342 – Harry May 28 '22 at 03:56

0 Answers0