[英]In C++ storing and retrieving of character vector (vector<char>) of all zero value (i.e. '\0' or string terminator) from file
使用fstream
我创建了一个文件来存储一个固定长度的零值 (0) 序列,即字符向量 (vector) 中可用的 '\0' ASCII 码。
fstream Fpt;
Fpt.open("Data.bin",ios::out|ios::binary);
std::vector<char> V;
char c=0;
for(int i=0;i<10;i++)V.push_back(c);
Fpt.write((char *)&V,10);
Fpt.close();
Fpt.open("Data.bin",ios::in | ios::out|ios::binary);
V.clear();
Fpt.read((char *)&V, 10);
for(auto v: V) printf("(%c,%d,%X)",v,v,v);
但是 output 看起来像 (▌,-35,FFFFFFDD) (▌,-35,FFFFFFDD)...
您编写向量 object 本身,而不是向量包装的数据(位于堆上)。
您需要获取指向数据本身的指针并写入:
Fpt.write(V.data(), V.size());
同样,在读取数据时,需要将其读入包装好的数据中:
V = std::vector<char>(10); // Reset the vector, remembering to set its size
Fpt.read(V.data(), V.size());
这种说法是不正确的:
Fpt.write((char *)&V,10);
您正在获取存储在堆栈中的向量 object V
的地址。 您想要的是V
指向的底层缓冲区(存储在堆上)的地址,因此您需要使用data
成员 function。
所以改为这样做:
Fpt.write( V.data(), 10 );
或这个:
Fpt.write( &V[0], 10 );
你在这里做的是一个坏主意:
char c=0;
for ( int i = 0; i < 10; i++ ) V.push_back(c);
一旦大小达到容量,这将导致向量重复重新分配其缓冲区。 这在性能方面很糟糕。
相反,把它写成:
std::vector<char> V(10);
现在V
将被初始化为 10 个\0
字符。 无需使用循环来填充容器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.