не понимаю в чём проблема. Пытаюсь считать данные из файла, считывается непонятно что.
Вот сам код: (ниже есть пример отладки кода, данных в файле и их чтения)
#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 < m; i++)
cout << *arr + i << endl;
delete[] arr;
system("pause");
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
fscanf(pf, "%d\n", &l);- неправильно. Так вы считываете значение не в элемент массива по указателю, а в саму переменную-указатель. Правильно:fscanf(pf, "%d\n", l);– LShadow77 May 27 '22 at 20:22cout << *arr + i << endl;- неправильно. Ну если вы не желаете выводить значение первого элемента массива плюсi. А если желаете выводить значениеi-го элемента массива, то правильно так:cout << *(arr + i) << endl;. А ещё лучше так:cout << arr[i] << endl;– LShadow77 May 27 '22 at 20:27if ((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:36fopen()возвратилаNULL, нужно либо возвращатьfalse(и возвращаемое значение проверять в вызывающем коде), либо аварийно завершать работу программы. – LShadow77 May 27 '22 at 20:44feof()— см. https://ru.stackoverflow.com/q/833980/195342 – Harry May 28 '22 at 03:56