Хакер ты предложил, на сколько я помню, правильный принцип. Но не решение. И -  в плане кода - не самое простое. 
Самое простое решение предложил я 

 В нем есть недостатки (избыточность данных и сложность редактирования файла), но для этой задачи его хватает за глаза. Твой вариант более правильный, но он и более сложный.
Лаборатор Где ты увидел, что меня сильно раскритиковали? Просто показали недостатки моего подхода. Которые для твоей задачи - совершенно не существенны. Избыточность? Ну, может и будет заметна, если перевалить за пару сотен мегов 

 Сложность редактирования? 
iGrok  показал, как это довольно легко обойти, если вдруг всё-таки понадобится.
Зато доступ к данным - мгновенный, и ничего парсить или шифровать не надо, загружается - только нужная запись, а не вся база. Главное достоинство - простота использования и минимум кода.
В общем мой примерчик - это почти готовое решение для тебя. И если оно кажется тебе слишком сложным, то уж решение Хакера точно сложнее 
 iGrok
 iGrokiGrok писал(а):SAFEARRAY, заголовки строк. При наличии множества мелких строк - это офигенный лишний вес.
 SAFEARRAY можно вообще исключить - если в структурке хранить ответы не массивом, а одной, разбитой нулями, строкой (даже короче получится, чем длины хранить), а смещения и так и этак нужны. 
Если уж так нужно сэкономить, то можно ещё немного поступиться простотой и хранить каждую запись не структуркой, а одной нулями  разбитой строкой: первая часть - вопрос, остальные - ответы, три-четыре первых байта - зашифрованный номер ответа.
А если ещё усложнить и раздельно хранить вопросы с ответами (чтобы можно было отдельно их читать), то уже совсем будет рукой подать до варианта Хакера
Кстати, если  все строки хранить отдельно, может ещё и больше избыточность будет: смещения-то нужно будет для каждой стоки, а не как у меня - для всей структурки, так что сэкономить удастся, только если много повторяющихся строк.