Запись логических значений в файл - PullRequest
1 голос
/ 09 июня 2010

У меня есть кусок кода, который дает ошибку во время выполнения.Может кто-нибудь помочь выяснить, почему?

vector<int> intData;
vector<bool> boolData;


for(int i=0;i<19000;i++)
   boolData.push_back(false);


string ofile = "tree.dat";
ofstream fout(ofile.c_str(),ios::out | ios::binary);


if (!boolData.empty()) fout.write((char *)&boolData[0], sizeof(bool)*boolData.size());
fout.close();

Выдает ошибку при попытке записи файла (fout.write).

Ответы [ 2 ]

4 голосов
/ 09 июня 2010

Вы не можете взять адрес члена vector <bool>.Это потому, что vector <bool> является специализированной версией std :: vector, и вещи, хранящиеся в таком векторе, на самом деле не bools, а отдельные биты, которые не адресуемы.Если вам нужно взять адрес, используйте vector <char> или deque<bool>.Если вам также нужно, чтобы хранилище было смежным (что, как вам кажется, если вы хотите использовать write ()), тогда используйте vector <char>.

3 голосов
/ 09 июня 2010

vector<bool> специально включено в стандарт (23.2.5, lib.vector.bool).

Элементы в нем упакованы в биты, а не байты, то есть вы не можетевзять адрес отдельного элемента.

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

Моя рекомендация: вы используете vector<char>.

...