1. 首页
  2. 技术
  3. Linux

linux下c++读取大小不定的文件到存入char指针

#include <iostream>
#include <fstream>
 
    std::filebuf *pbuf;
    std::ifstream filestr;
    long size;
    char * buffer;
    // 要读入整个文件,必须采用二进制打开
    filestr.open ("../scripts/lua_script_test.lua", std::ios::binary);
    // 获取filestr对应buffer对象的指针
    pbuf=filestr.rdbuf();
 
    // 调用buffer对象方法获取文件大小
    size=pbuf->pubseekoff (0,std::ios::end,std::ios::in);
 
    pbuf->pubseekpos (0,std::ios::in);
    // 分配内存空间
    buffer = new char[size];
 
    // 获取文件内容
    pbuf->sgetn (buffer,size);
 
    filestr.close();
    // 输出到标准输出
    std::cout.write (buffer,size);

复制和输出文件

/*
 * FileTxtCopyTest.cpp
 *
 *  Created on: 2021年5月4日
 *      Author: hy
 *	当前内容主要为测试和使用C++中的文本拷贝(解决二进制文件的读取操作文件复制)
 */

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

int main(int argc, char **argv) {
  ifstream is; // 输入流
  ofstream os; // 输出流

  string isFilePath = "src/io/mybtais_lombok_generator.jar";  // 读取的文件位置
  string osFilePath = "src/io/copy.jar"; // 写入文件的位置

  //	定义一个buffer缓冲区
  int bufferSize = 1024;
  char* buffer = new char[bufferSize];
  // 1. 开始打开文件
  is.open(isFilePath, std::ios::binary); // 以二进制方式打开文件
  if (is.fail()) {
    cout << "打开读取的文件" << isFilePath << "失败!,请检查文件的路径是否存在该文件!" << endl;
    return 0;
  }
  //	2. 开始打开写入文件
  os.open(osFilePath, std::ios::binary);

  //	2. 开始读写文件
  while (is) {
    is.read(buffer, bufferSize);
    os.write(buffer, bufferSize);
  }

  cout << "执行复制文件成功!" << endl;

  delete[] buffer; // 删除buffer
  //	3. 顺序方式关闭当前的流
  is.close();
  os.close();

}

 

开发过程,遇见将文件以二进制的方式读取到缓存中的场景,于是在这里记录一下,方便以后复用。

读文件

void readFile(string& filePath, std::vector<unsigned char>& data )
{
  ifstream file(filePath.c_str(), std::ios::in | std::ios::binary);
  if(!(file.is_open()))
  {
    return;
  }
 
  file.seekg(0, std::ios::end); //定位输入流结束位置
  std::ios::pos_type endPos = file.tellg(); //获取输入流结尾指针
  unsigned long fileLen = static_cast<unsigned long>(endPos); //获取输入数据大小
 
  file.seekg(0, std::ios::beg);	//定位输入流开始位置
  data.resize(fileLen);
  file.read((char*)(&data[0]), fileLen);	//将输入数据读取到缓存中
  //自动关闭文件
}

写文件

void writeFile(string& filePath, vector<unsigned char> data )
{
  ofstream file(filePath.c_str(), std::ios::out | std::ios::binary);
  if(!(file.is_open()))
  {
    return;
  }
  file.write((char*)&data[0], data.size());	//将数据写到文件中
  //自动关闭文件

 

qt写入文件

QFile file2("C:\\Users\\lim\\Desktop\\test2.zip");
file2.open(QIODevice::WriteOnly);
QDataStream out(&file2);
//out.writeBytes(buffer,fileLen);
out.writeRawData(buffer,fileLen);
file2.close();

 

读写文件

ifstream file("C:\\Users\\lim\\Desktop\\test.zip",std::ios::in | std::ios::binary);
if(!(file.is_open()))
{
    return;
}
char * buffer;
file.seekg(0, std::ios::end); //定位输入流结束位置
std::ios::pos_type endPos = file.tellg(); //获取输入流结尾指针
unsigned int fileLen = static_cast<unsigned int>(endPos); //获取输入数据大小
buffer = new char[fileLen];
file.seekg(0, std::ios::beg);	//定位输入流开始位置
file.read(buffer, fileLen);	//将输入数据读取到缓存中
file.close();

QFile file2("C:\\Users\\lim\\Desktop\\test2.zip");
file2.open(QIODevice::WriteOnly);
QDataStream out(&file2);
//out.writeBytes(buffer,fileLen);
out.writeRawData(buffer,fileLen);
file2.close();

 

原创文章,作者:admin,如若转载,请注明出处:https://www.huiyingwu.com/4353/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注