C ++, как хранить целое число в двоичном файле? - PullRequest
4 голосов
/ 24 марта 2010

У меня есть структура с 2 целыми числами, и я хочу сохранить их в двоичном файле и прочитать снова.

Вот мой код:

static const char *ADMIN_FILE = "admin.bin";
struct pw {  
  int a;  
  int b;
};

void main(){  
  pw* p = new pw();  
  pw* q = new pw();  
  std::ofstream fout(ADMIN_FILE, ios_base::out | ios_base::binary | ios_base::trunc);  
  std::ifstream fin(ADMIN_FILE, ios_base::in | ios_base::binary);  
  p->a=123;  
  p->b=321;  
  fout.write((const char*)p, sizeof(pw));  
  fin.read((char*)q, sizeof(pw));  
  fin.close();  
  cout << q->a << endl;
}  

Я получаю вывод 0. Может кто-нибудь сказать мне, в чем проблема?

Ответы [ 5 ]

5 голосов
/ 24 марта 2010

Вы, вероятно, хотите сбросить fout, прежде чем читать с него.

Чтобы очистить поток, выполните следующие действия:

fout.flush();

Причина этого заключается в том, что потоки обычно хотят как можно дольше буферизовать вывод, чтобы снизить стоимость. Чтобы принудительно очистить буфер, вы вызываете flush для потока.

3 голосов
/ 24 марта 2010

При хранении целых чисел в файлах вы можете использовать семейство функций htonl(), ntohl(), чтобы гарантировать, что они будут считаны в правильном формате независимо от того, записан ли файл на машине с прямым порядком байтов, и прочитайте позже на машине с прямым порядком байтов. Функции были предназначены для использования в сети, но могут быть полезны при записи в файлы.

0 голосов
/ 28 марта 2010

попробуйте это:

fout.write((const char*)&p, sizeof(pw));  
fin.read((char*)&q, sizeof(pw));  

вместо

fout.write((const char*)p, sizeof(pw));  
fin.read((char*)q, sizeof(pw));  

vagothcpp (yournotsosmartc ++ programmer = p)

0 голосов
/ 24 марта 2010

Имейте в виду, что ваш метод предполагает наличие данных о размере и порядке следования ваших целых чисел и об упаковке ваших структур, ни одна из которых не обязательно будет верной, если ваш код будет перенесен на другую машину.

По причинам переносимости вы хотите иметь выходные процедуры, которые выводят поля структур отдельно, и которые выводят числа с определенной битовой шириной с определенным порядком байтов. Вот почему существуют пакеты сериализации.

0 голосов
/ 24 марта 2010
fin.write((char*)q, sizeof(pw));  

Вероятно, должно быть

fin.read((char*)q, sizeof(pw));  
...