Да, данный способ верен для POD-типов и хорош тем что не надо задумываться о внутреннем устройстве структуры/класса — единственное, что нужно использовать — массивы вместо указателей. Также, его можно легко расширить, добавив дополнительные данные в структуру и ничего не поломается(если нет необходимости в поддержке совместимости со старыми форматами файлов где хранится информация). В рамках поставленной задачи — самое разумное решение в 30-50 строк. Ну и что, что файл может стать большим — чем-то приходится жертвовать.
Раз кто-то усомнился в том что так можно(а минусов-то понаставили

) — привожу полный код решения.
Запись :
#include <fstream>
#include <vector>
using namespace std;
struct Person {
int age;
char fir_name[30];
char sec_name[30];
};
Person p = {20, "Martin", "Fowler"};
int main () {
vector<Person> pers;
pers.push_back(p);
pers.push_back(p);
ofstream out ("data.txt", ios::binary);
int size = pers.size();
out.write((char*)(&size), 4);
out.write((char*)&pers[0], pers.size()*sizeof(Person));
out.close();
}
Чтение :
#include <fstream>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct Person {
int age;
char fir_name[30];
char sec_name[30];
};
Person p;
int main () {
vector<Person> pers;
int size = 0;
ifstream in("data.txt", ios::binary);
in.read((char*)&size, 4);
pers.resize(size);
in.read((char*)&pers[0], size*sizeof(Person));
for_each(pers.begin(), pers.end(), [](Person p) -> int {
cout << "age-" << p.age << endl;
cout << "fir_name-" << p.fir_name << endl;
cout << "sec_name-" << p.sec_name << endl
});
in.close();
}