Как записать данные динамического массива в бинарный файл? (С++)

При размерности меньше 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 шт):

Автор решения: Laukhin Andrey

Как верно заметили в комментариях, попытка определить 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;
}
→ Ссылка