首页 > 其他分享 >滴水-文件读写 开源代码

滴水-文件读写 开源代码

时间:2022-10-12 19:58:59浏览次数:58  
标签:文件 head int 读写 char fileAdress 源代码 滴水 size

#include <stdio.h>
#include <malloc.h>
#include <string.h>
//此处是禁用函数警报
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4996)
FILE* openFile(char* filePath, char* type);//打开文件函数 返回指向文件缓冲区流头指针

int getSize(FILE* fileAdress);//得到文件大小函数 返回文件大小

char* allotspace(int size);//分配内存空间函数 根据得到的文件大小 返回内存空间首地址

char* readFiletoMemory(FILE* fileHeadAdress, char* head, int size);//将文件写入分配好的空间的函数 返回已经写入数据的内存空间首地址

int writeMemorytoFile(char* filePath, char* type, char* head, int size);//将内存中的数据写出到文件函数

int main()
{
    //给定读取的文件路径
    char filePath[] = "D:\\测试程序.exe";
    //给定读写类型
    char type[] = "rb+";
    //打开文件传递文件流首地址
    FILE* fileAdress = openFile(filePath, type);
    //通过文件流首地址得到文件大小
    int fileSize = getSize(fileAdress);
    //通过文件大小开辟内存空间并初始化
    char* head = allotspace(fileSize);
    //将文件流中数据读入开辟的内存空间内
    head = readFiletoMemory(fileAdress, head, fileSize);
    //给定写出的文件路径
    char filePath2[] = "D:\\10.exe";
    //给定读写类型
    char type2[] = "wb+";
    //将内存空间内的数据写出
    writeMemorytoFile(filePath2, type2, head, fileSize);
    //关闭文件流
    fclose(fileAdress);
    //释放内存
    free(head);

    return 0;
}




//打开文件函数 返回指向文件缓冲区流头指针
FILE* openFile(char* filePath, char* type) {
    FILE* fileAdress;
    //通过传入的文件地址以及读写类型打开文件创建文件流
    if (!(fileAdress = fopen(filePath, type)))
    {
        printf("获取文件出错!\n");
        return 0;
    }
    return fileAdress;
}

//得到文件大小函数 返回文件大小
int getSize(FILE* fileAdress) {
    int size;
    //定位文件末尾
    fseek(fileAdress, NULL, SEEK_END);
    //得到文件流大小
    size = ftell(fileAdress);
    //重定位文件开头
    fseek(fileAdress, NULL, SEEK_SET);
    return    size;
}

//分配内存空间函数 根据得到的文件大小 返回内存空间首地址
char* allotspace(int size) {
    char* head;
    //根据文件大小分配内存空间
    if (!(head = (char*)malloc(size))) {
        printf("分配空间失败!\n");
        return 0;
    }
    //使用1初始化size大小已经分配的内存空间
    memset(head, 1, size);
    //返回分配初始化完毕的内存空间首地址
    return head;
}

//将文件写入分配好的空间的函数 返回已经写入数据的内存空间首地址
char* readFiletoMemory(FILE* fileHeadAdress, char* head, int size) {
    //通过传入的文件地址以及开辟的内存空间首地址和文件大小将文件数据写入分配好的内存空间中
    if (!(fread(head, 1, size, fileHeadAdress) == size)) {
        printf("文件数据写入内存出错!");
        return 0;
    }
    //读取文件数据写入内存
    return head;
}

//将内存中的数据写出到文件函数
int writeMemorytoFile(char* filePath, char* type, char* head, int size) {
    //定义创建文件流
    FILE* fileAdress = openFile(filePath, type);
    //读取内存数据写出到文件
    if (!(fwrite(head, 1, size, fileAdress) == size)) {
        printf("内存数据写出到文件出错!\n");
        return 0;
    }
    return 1;
}

代码来源 https://zhuanlan.zhihu.com/p/106775151

我是懒得写了,讲解视频

https://www.bilibili.com/video/BV1wG411773m/

标签:文件,head,int,读写,char,fileAdress,源代码,滴水,size
From: https://www.cnblogs.com/msdn/p/16785732.html

相关文章

  • mysql数据库新增用户只有读写权限
    CREATEUSER'pcms'@'%'IDENTIFIEDBY'123456';  --创建用户pcms,密码为123456GRANTSELECT,INSERT,UPDATE,DELETEONdatabase1.*TO'pcms';--赋予pcms账号,datab......
  • c++读写文件
    #include<iostream>#include<fstream>#include<string>usingnamespacestd;intmain(){ofstreamf; f.open("test.txt",ios::out); f<<"aaaaaa"<<endl; ifst......
  • WebAssembly01--在JavaScript中读写C/C++内存
    编译选项emccmem.cc-omem.jsmem.cc#include"util.h"intg_int=42;doubleg_double=3.1415926;EM_PORT_API(int*)get_int_ptr(){return&g_int;}EM_PO......
  • OpenCV-图像读写(java版)
    @​​TOC​​图像读写Imgcodecs类中提供了图像的读写方法。使用imread()函数读取磁盘中的图像;使用imwrite()函数将图像写入磁盘中以下图为例演示。​​(图片来源网络)​​......
  • OpenCV-视频读写(java版)
    @​​TOC​​​​​OpenCV2中提供了两个类来实现视频的读写。读视频的类是​​VideoCapture​​,写视频的类是​​VideoWriter读视频VideoCapture既可以从视频文件读取图......
  • OpenCV-像素值读写(java版)
    @​​TOC​​​很多时候,我们需要读取某个像素值,或者设置某个像素值,甚至需要遍历整个像素值。​​​OpenCV中RGB图像的通道为BGR!!!​​1.读像素值1.get()函数OpenCV中使用get......
  • 浅谈MySQL、Hadoop、BigTable、Clickhouse数据读写机制
    个人理解,欢迎指正数据库引擎写数据读数据补充MySqlInnoDB:支持事务,高速读写性能一般Myisam:不支持事务,高速读写性能好以InnoDB更新一条记录为例1、B+Tree......
  • StoneDB 读写分离实践方案
    StoneDB读写分离实践方案在StoneDB1.0版本中,InnoDB引擎处理OLTP的事务型业务,Tianmu引擎处理OLAP的分析型业务。因此,需要在主从复制环境的基础上做读写分离,所有的......
  • GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
      预期目标源代码管理借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等。自动化部署源代码产生变更时(如签入),自动化编译并......
  • LcdTools如何自定义读写PX01 SSD2828寄存器
    LcdToos打开相应的工程文件,连接PX01并开启点亮屏使LcdTools开关处于开启状态。切到“测试设置”栏,在“Bridge控制”栏,在“Addr”处写需要操作的寄存器地址值(十六......