Если бы я делал это, я думаю, я бы структурировал это немного по-другому.
Во-первых, я бы перегрузил operator>>
для record
:
std::istream &operator>>(std::istream &is, record &r) {
// code about like you had in `read_all_records` to read a single `record`
// but be sure to return the `stream` when you're done reading from it.
}
Тогда я бы использовал std::vector<record>
вместо массива - он гораздо менее подвержен ошибкам.
Чтобы прочитать данные, я бы использовал std::istream_iterator
s, вероятно, предоставив их конструктору для vector<record>
:
std::ifstream invfile("inventory.dat");
std::vector<record> records((std::istream_iterator<record>(invfile)),
std::istream_iterator<record>());
Между ними (т. Е. После создания файла, но перед вектором) находится место, где вы вставляете обработку ошибок, примерно в порядке, рекомендованном @Tom Kerr - проверки для is_open()
, bad()
, eof()
и т. Д., Чтобы выяснить, что (если что-то) идет не так при попытке открыть файл.