#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();