为何用std::ifstream读取数据到vector后,vector大小为0?
为什么vector的size输出为0?
问题出在reserve和vector::size()的本质上:
file_vec.reserve(4)只是为vector预留了能装下4个元素的内存空间,但并没有真正创建任何元素。vector的size()返回的是当前实际存在的元素数量,不是预留的内存容量,所以此时size还是0。ifs.read(file_vec.data(), 4)确实把4个字符写到了vector预留的内存区域里,但vector内部维护的size值不会自动更新——它不知道外部往自己的内存里写了数据,所以输出时size依然是0。
两种解决办法:
- 用
resize替代reserveresize(4)会直接创建4个默认初始化的元素,此时vector的size变为4,后续read写入数据后,size保持4,能正确反映元素数量:
#include <iostream> #include <fstream> #include <vector> int main() { std::ifstream ifs("file.txt"); std::vector<char> file_vec{}; file_vec.resize(4); // 替换reserve为resize ifs.read(file_vec.data(), 4); std::cout << file_vec.size() << std::endl; // 输出4 ifs.close(); }
- 读取后手动更新size
如果想保留reserve的内存预分配(避免不必要的内存分配),可以读取后用ifs.gcount()获取实际读取的字节数,再手动调整vector的size,这种方式还能处理文件不足4个字符的情况:
#include <iostream> #include <fstream> #include <vector> int main() { std::ifstream ifs("file.txt"); std::vector<char> file_vec{}; file_vec.reserve(4); ifs.read(file_vec.data(), 4); file_vec.resize(ifs.gcount()); // 根据实际读取的字节数更新size std::cout << file_vec.size() << std::endl; // 输出实际读取的字符数(这里是4) ifs.close(); }
内容的提问来源于stack exchange,提问作者user3472
相关产品推荐
相关产品推荐

