Как записать данные динамического массива в бинарный файл? (С++)
При размерности меньше 5 после ввода значений массива выводится бесконечная лавина каких-то одинаковых чисел, но результат в виде чисел в файле был, при 5 и больше - заканчивается со значением 3221225477 и файл не меняется. Пробовал без перевода в бинарный тип - результат наполовину тот же, только может наконец выводить записанные в файл числа, но тоже лишь при размерности меньше 5.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
setlocale(LC_ALL, "RUS");
ofstream F("F.txt");
int i, n;
int m[n];
cout << "Введите количество чисел - ";
cin >> n;
for (i=0; i<n; i++)
{
cout << "Число №" << i+1 << " - ";
cin >> m[i];
}
for (i=0; i<n; i++)
{
F << m[i] << '\t';
}
F.close();
F.open("F.dat", ios::binary);
for (i=0; i<n; i++)
{
F.write((char*)&m, sizeof(m));
}
F.close();
ifstream Fb("F.dat", ios::binary);
while (Fb.read((char*)&m, sizeof(m)))
{
cout << m[i] << '\t';
}
Fb.close();
system("pause");
return 0;
}
Ответы (1 шт):
Как верно заметили в комментариях, попытка определить m[n] происходит до того, как мы ввели значение n, соответственно, n - не определено. По идее, статический массив должен иметь известный компилятору размер и для меня загадка, как у вас это вообще компилируется.
Используйте динамическое выделение памяти.
Главная же проблема в том, что вы записываете в файл не значение, а адрес указателя. Читаете так же.
F.write((const char*) &m[i], sizeof(m)) - так будет работать.
C другой стороны, если нам известен размер массива, зачем записывать поэлементно в цикле?
Количество байт для записи: int charsCount = sizeof(int) * n
Запись: write((const char*) m, charsCount)
Чтение: read((char*) r, charsCount)
Пример:
int main()
{
setlocale(LC_ALL, "RUS");
int i, n;
cout << "Введите количество чисел - ";
cin >> n;
int* m = new int[n];
int* r = new int[n];
for (i = 0; i < n; i++)
{
cout << "Число №" << i + 1 << " - ";
cin >> m[i];
}
int charsCount = sizeof(int) * n;
ofstream F("F.dat", ios::binary);
F.write((const char*) m, charsCount);
F.close();
ifstream Fb("F.dat", ios::binary);
Fb.read((char*) r, charsCount);
Fb.close();
for (i = 0; i < n; i++)
cout << r[i] << '\t';
delete[] m;
delete[] r;
system("pause");
return 0;
}