2010-06-09 29 views
1

我有一段代码给出了运行时错误。任何人都可以帮忙找出原因吗?向文件写入布尔值

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)时给出错误。

+0

为什么地球上你使用fout.write而不是operator <<? – Puppy 2010-06-09 10:06:06

+0

@DeadMG:因为'operator <<'会将数据格式化为文本;这段代码试图从矢量的内容中生成一个二进制文件。 – 2010-06-09 10:24:36

+0

供参考:http://www.gotw.ca/gotw/050.htm - 如果你有兴趣的矢量 Default 2010-07-07 15:50:57

回答

4

您不能接收vector <bool>的成员的地址。这是因为vector <bool>是std :: vector的专用版本,存储在这种向量中的东西实际上并不是bools,而是单个位,这些位不可寻址。如果您需要接收地址,请改用vector <char>deque<bool>。如果您还需要将存储设备连续存储(如果您想使用write()),则使用vector <char>

+0

那么,为什么这个工作?如果(!intData.empty())fout.write((char *)&intData [0],sizeof(int)*(int)intData.size()); 我读过矢量存储连续的数据,所以存在一个问题。 – Sara 2010-06-09 10:02:17

+1

@Sara,intData不是矢量,其矢量。这是在这方面的一个重要的区别 – Will 2010-06-09 10:06:13

+0

@Sara阅读我的答案 - '矢量'是一个*特殊的*矢量 - 究竟它如何存储它的内容不是由C++标准指定的。 – 2010-06-09 10:10:35

3

vector<bool>是专门包含在标准(23.2.5,lib.vector.bool)中。

它中的元素被打包成不是字节的位,这意味着你不能获取单个元素的地址。

你可以改变你的实现来编写你的向量所使用的底层分配,但它更容易使用vector<char>来存储你的布尔变量。

我的建议是你使用vector<char>