2013-10-13 3 views
1

я написал два экземпляра СК1, СК2 из структуры по имени Куки и сохранили их в двоичный файл с именем «mydat», вызвав функцию:Как читать несколько структур из бинарного файла

bool s_cookie(Cookie myck,std::string fname) { 

std::ofstream ofs(fname,std::ios::binary | std::ios::app); 
if(!ofs) return false; 

ofs.write((char *) &myck, sizeof(Cookie)); 

ofs.close(); 

return true; 

} 

из Конечно, myck может быть ck1, ck2 и т. д., а fname повторяет двоичный файл mydat. Таким образом, две структуры были сохранены в одном файле. Теперь я хочу прочитать их обратно в ck3 и ck4 соответственно. Как мне это сделать? Cookie выглядит следующим образом:

struct Cookie { 
    std::string name; 
    std::string value; 
    unsigned short duration; 
    bool expired; 
}; 

Благодаря

+0

Можете ли вы дать определение 'Cookie'? Это просто структура POD? –

+0

только что добавили его в edit check it out –

+2

В этом проблема. Вы не можете сохранить такую ​​структуру в файл с помощью двоичного ввода-вывода. Двоичный ввод-вывод не работает в std :: string. Причина в том, что std :: string содержит внутренние указатели, а указатели не могут быть значимо сохранены в файле. Таким образом, вам не повезло, вам придется попробовать другой путь. Обычный способ сохранения строки с использованием двоичного ввода-вывода - это сначала сохранить длину строки, а затем сохранить сами символы. Затем при чтении вы делаете то же самое, читаете длину строки, выделяете память для символов, читаете символы. – john

ответ

1

Что-то вроде письма, но read их, если Cookie является POD:

std::ifstream ifs(fname,std::ios::binary); 

Cookie ck3, ck4; 

ifs.read((char *) &ck3, sizeof(Cookie)); 
ifs.read((char *) &ck4, sizeof(Cookie)); 

Кроме того, вы должны проверить результат каждого открытия и чтения работать и обрабатывать их.


Update: После вашего обновления и видеть в Cookie, вы не можете просто записать его в файл. Вы должны сериализовать его или создать четко определенный протокол для чтения/записи данных.

Простое решение есть (прочитать комментарий):

// Assume name and value are not longer that 99 
// and you don't care about wasted space in the file 

struct CookiePOD { 

    CookiePOD(const Cookie &p) 
    { 
     // I ignored bound checking ! 
     std::copy(p.name.begin(), p.name.end(), name); 
     name[p.name.size()] = 0; 

     std::copy(p.value.begin(), p.value.end(), value); 
     value[p.value.size()] = 0; 

     duration = p.duration; 
     expired = p.expired; 
    } 

    char name[100]; 
    char value[100]; 
    unsigned short duration; 
    bool expired; 
}; 

А затем попытаться читать/писать CookiePOD вместо Cookie.

+0

К сожалению, это не работает, потому что структура OP не является POD (я знаю, что это было опубликовано до того, как он обновил свой вопрос). – john

+0

Спасибо, что работает, но если теперь запустить программу. Программа завершается. Я работаю над Windows, и программа прекращает выполнение во время выполнения. Дополнительная информация –

+0

@BarbelZeusBryo То, что вы пытаетесь, не будет работать. См. Комментарий, который я сделал по вашему вопросу. М. М. дал этот ответ, прежде чем знал, что было в вашей структуре. – john

Смежные вопросы