c++17 如何读取二进制文件

本文讲述了作者在通过TCPsocket发送视频文件时,使用getline导致数据丢失的问题,随后通过`vector`和二进制模式成功解决,展示了C++中处理大文件输入流的不同方法。
摘要由CSDN通过智能技术生成

今天在想通过tcp socket 来send一个视频文件时,最初我像往常一样使用getline来获取数据发送,然后发现客户端收到的是不完整的。通过c++输入文件流ifstream用法详解-CSDN博客

所以会有数据丢失。后面我通过char[size+1]来存放数据,然后发现数据并没有存入,后面改用vector<char>才能看到数据。

//成功读取到的版本

std::vector<char> readFile(const std::string &recource)
{
    
    std::ifstream in(recource, std::ifstream::binary);
    if(!in.is_open()) return std::vector<char>();
  
     // 移动到文件末尾以获取文件大小  
     in.seekg(0, std::ios::end);// 也可在 in的打开方式 | std::ios::ate
    std::streamsize size = in.tellg();  
      
    // 回到文件开头  
    in.seekg(0, std::ios::beg);  
    std::cout<<size<<'\n';
    // 使用 vector 分配足够的内存来存储文件内容  
    std::vector<char> buffer(size);  
    
    in.read(buffer.data(), size);
    in.close();
    return buffer;  
    
}

//最开始错误的版本

std::string readFile(const std::string &recource)
​
{
​
  std::ifstream in(recource, std::ifstream::binary);
​
  if(!in.is_open()) return "404";
​
  std::string content;
​
  std::string line;
​
  while(std::getline(in, line)) content += line;
​
  in.close();
​
  return content;
​
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值