Linux学习-文件IOA1——用结构体和文件操作函数实现文件的拷贝

其实我们不必选用结构体去实现模仿拷贝功能的,但是为了锻炼我们的思维以及对结构体、文件操作函数的使用,所以我们就这样来折腾自己。
学习的过程就是将复杂的事情简单化,再将简单的事情复杂化,这样才会对只是理解更深刻透彻,运用的也会更加得心应手,我们在实际上遇到问题的时候也能从不同角度考虑问题了。(后面的注意事项要看,不然使用方法错误会浪费时间)
以下是参考代码以及注释:

 #include<sys/types.h>//open头文件
#include<sys/stat.h>//open头文件
#include<fcntl.h>//open头文件
#include<unistd.h>//write、read、close头文件
#include<stdio.h>
#include<string.h>
#include<errno.h>//perror头文件
#include<stdlib.h>//memset头文件#define ERROR    -1            //宏定义-1的值
#define ERROR_P  ((P_FI)ERROR) //为了方便Open_Function函数的返回值
#define SUCCESS  0             //宏定义0的值typedef struct file_information{int open_a_fd;//文件a的描述符int open_b_fd;//文件b的描述符int write_num;//每次读取文件的大小char *pointer_a;//文件a的路径地址char *pointer_b;//文件b的路径地址
}FI,*P_FI;//定义结构体类型//-----初始化以及打开文件函数的定义-------------------------------------
P_FI Open_Function(char *argv_1,char *argv_2);//-----写入文件数据函数的定义-------------------------------------------
int Write_Function(P_FI type);//-----关闭释放文件空间函数的定义---------------------------------------
int Close_Function(P_FI type);//-----初始化以及打开文件函数-------------------------------------------
P_FI Open_Function(char *argv_1,char *argv_2)
{//-------初始化内存空间-----------------------------------//给结构体opinter_strcut申请内存P_FI opinter_strcut = (P_FI)malloc(sizeof(FI));//判断是否成功,要养成良好的习惯,即使以后用不到,也要培养这个思维if(opinter_strcut == NULL){printf("malloc opinter_struct");}//初始化,清空内存里面的乐色数据,防止数据乱码情况发生memset(opinter_strcut,0,sizeof(FI));//给pointer_a申请空间,存放路径地址opinter_strcut->pointer_a = (char *)malloc(sizeof(*argv_1));//判断是否成功,要养成良好的习惯,即使以后用不到,也要培养这个思维if(opinter_strcut->pointer_a == NULL){perror("malloc pointer_a");//返回一个错误时候的指针,我们将-1强制类型转化,上面有宏定义return ERROR_P;}//给pointer_b申请空间,存放路径地址opinter_strcut->pointer_b = (char *)malloc(sizeof(*argv_2));//判断是否成功,要养成良好的习惯,即使以后用不到,也要培养这个思维if(opinter_strcut->pointer_b == NULL){perror("malloc pointer_b");//返回一个错误时候的指针,我们将-1强制类型转化,上面有宏定义return ERROR_P;}//初始化,清空内存里面的乐色数据,防止数据乱码情况发生memset(opinter_strcut->pointer_a,0,sizeof(*argv_1));//初始化,清空内存里面的乐色数据,防止数据乱码情况发生memset(opinter_strcut->pointer_b,0,sizeof(*argv_2));//------打开文件,并且赋值到结构体里面----------------------//初始化掩码,防止后面给权限的时候出错umask(0000);//打开文件a,并把文件描述符赋值到结构体对应的变量open_a_fdopinter_strcut->open_a_fd = open(argv_1,O_RDONLY);//打开文件b,并把文件描述符赋值到结构体对应的变量open_b_fdopinter_strcut->open_b_fd = open(argv_2,O_WRONLY | O_CREAT,0777);//定义每次读取的数据大小,赋值给结构体变量write_numopinter_strcut->write_num = 20;//函数返回值,返回一个指针return opinter_strcut;
}//-----写入文件数据函数的定义-------------------------------------------
int Write_Function(P_FI type)
{//-----定义空间作为读取数据的缓存区------------------------char array[type->write_num];//定义两个变量接受read和write的返回值,在while外面定义就不用每次循环都申请一次//优化了程序运行int read_ret,write_ret;//循环读取数据,写入数据while(1){//初始化,清空上一次的数据,防止上一次的数据残留会使新数据出现乱码memset(array,0,sizeof(type->write_num));//读文件a,read_ret接收返回值,进行判断是否成功read_ret = read(type->open_a_fd,array,type->write_num);//判断是否成功//情况1:当返回值是-1时,说明read失败,退出;if(read_ret == ERROR){perror("read a");return ERROR;}//情况2:当返回值是0的时候,说明已经读取完、写完数据,退出;else if(read_ret == SUCCESS){printf("文件读取完成!\n");return SUCCESS;}else//情况3:说明read还在读取数据,你们玩吗就马上将读取的数据写入文件b里面{//写入文件b,write_ret接收返回值,进行判断是否成功write_ret = write(type->open_b_fd,array,read_ret);//判断是否成功,要养成良好的习惯,即使以后用不到,也要培养这个思维if(write_ret == ERROR){perror("write");return ERROR;}}}
}//-----关闭释放文件空间函数---------------------------------------------
int Close_Function(P_FI type)
{//关闭文件aint close_ret_a = close(type->open_a_fd);//判断是否成功,要养成良好的习惯,即使以后用不到,也要培养这个思维if(close_ret_a == ERROR){perror("close a");}//关闭文件bint close_ret_b = close(type->open_b_fd);//判断是否成功,要养成良好的习惯,即使以后用不到,也要培养这个思维if(close_ret_b == ERROR){perror("close b");}//释放结构体里面open_a_fd申请的空间,//不能先释放结构体的内存,因为这样做的话我们会找不到open_a_fd的位置;free(type->pointer_a);//释放结构体里面open_b_fd申请的空间,//不能先释放结构体的内存,因为这样做的话我们会找不到open_b_fd的位置;free(type->pointer_a);//最后再释放结构体。free(type);return  SUCCESS;
}//-----主函数----------------------------------------------------------
int main(int argc,char *argv[])
{//-----初始化以及打开文件函数的调用----------------------------------P_FI open_p = Open_Function(argv[1],argv[2]);//判断是否成功if(open_p == ERROR_P){printf("打开文件失败!\n");return ERROR;}//-----写入文件数据函数的调用---------------------------------------int write_ret = Write_Function(open_p);//判断是否成功if(write_ret == ERROR){printf("写入文件失败!\n");return ERROR;}//-----关闭释放文件空间函数的调用-------------------------------------Close_Function(open_p);//主函数返回值return SUCCESS;
}

注意:这样写我们运行的时候不是./文件名 哦,是./文件名 要被拷贝的文件名 拷贝到文件的文件名。例如我要将a.txt的数据拷贝到b.txt,在main文件上执行,那么我的运行命令格式就是:./main a.txt b.txt

代码略长。加油小白菜!

Linux学习-文件IOA1——用结构体和文件操作函数实现文件的拷贝相关推荐

  1. Golang Json文件解析为结构体工具-json2go

    代码地址如下: http://www.demodashi.com/demo/14946.html 概述 json2go是一个基于Golang开发的轻量json文件解析.转换命令行工具,目前支持转换输出 ...

  2. linux驱动 cdev,inode结构体

    前面我们学习了字符设备结构体cdev  Linux 字符设备驱动开发 (一)-- 字符设备驱动结构(上)  下面继续学习字符设备另外几个重要的 数据结构. 先看下面这张图,这是Linux 中虚拟文件系 ...

  3. Linux中表示“时间”的结构体和相关函数

    转载于:http://blog.chinaunix.net/uid-25909722-id-2827364.html Linux中表示"时间"的结构体和相关函数 2011-09-1 ...

  4. linux系统中struct timeval结构体、struct timezone结构体以及gettimeofday函数

    格林尼治时间.协调世界时 间.世界时间.日光节约时间以及时区等介绍: 格林尼治时间(Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台当地的标准时间,因为本初子午 ...

  5. 33. 使用fread()/fwrite()往文件中写入结构体,从文件中读出结构体

    1 //读写结构体 2 #include <stdio.h> 3 typedef struct student 4 { 5 int num; 6 char name[30]; 7 char ...

  6. 【C 语言】文件操作 ( 学生管理系统 | 命令行接收数据填充结构体 | 结构体写出到文件中 | 查询文件中的结构体数据 )

    文章目录 一.学生管理系统 二.代码示例 一.学生管理系统 前两篇博客 [C 语言]文件操作 ( 将结构体写出到文件中并读取结构体数据 | 将结构体数组写出到文件中并读取结构体数组数据 ) [C 语言 ...

  7. 【C 语言】文件操作 ( 读取文件中的结构体数组 | feof 函数使用注意事项 )

    文章目录 一.读取文件中的结构体数组 | feof 函数使用注意事项 二.代码示例 一.读取文件中的结构体数组 | feof 函数使用注意事项 读取文件结构体时 , 可以循环读取文件中的数据 , 只使 ...

  8. 一起学习C语言:结构体(二)

    上一篇<一起学习C语言:结构体(一)> 中,我们了解了结构体的概念与定义形式,以及结构体变量初始化赋值.本章节,我们分析结构体成员访问形式,以及结构数组使用的场景. 章节预览: 4. 结构 ...

  9. 学习STM32单片机之结构体思想

    学习目标: 掌握 STM32 基础知识 学习STM32单片机之------结构体思想 学习内容: 1.我们在操作寄存器的时候,操作的是寄存器的绝对地址,如果每个寄存器都这样操作,那将非常麻烦. 2.我 ...

最新文章

  1. Spark Streaming事务
  2. 函数失败返回_为什么句柄返回值不一致?
  3. 深度学习-机器学习(5.2支持向量机SVM)
  4. 【liferay】6、关于liferay中使用requestMapping映射地址提交表单
  5. .NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例
  6. 部署Symantec Antivirus 10.0网络防毒服务器之三
  7. Spring源码之ApplicationContext(七)获取消息资源
  8. Quick-Cocos2d-x初学者游戏教程(五) --------------------- 辅助工具和跳转场景
  9. 将Linux目录下的文件放到子目录中
  10. 【Python】第七篇:模块化编程及第三方模块的安装
  11. 【python】将多个txt文件合并为一个txt文件
  12. 世界上公认最快的学习法 - 弗曼学习法
  13. Java导出Word文档的实现
  14. 计算机组成原理复习笔记——二、数据的表示和运算
  15. xshell如何导入.xsh 文件
  16. 程序员都是段子手,注释都带魔性
  17. KUKA机器人视觉1
  18. Hadoop3.x端口变化
  19. 根据用户的搜索需求,进行智能推送
  20. VS2010 MFC中对Access数据库基本操作

热门文章

  1. spring security+jwt 登录认证
  2. python知识整理(一)
  3. Linux:如何让内网的服务器能上网
  4. python爬电影的优点是_我用 Python 爬了点你们喜欢的电影,这些电影真的很不错!...
  5. Java(老白再次入门) - Java集合
  6. 下载最新的Windows10官方系统镜像
  7. 史上最亮眼成绩!中芯国际14nm工艺终于爆发了
  8. 安霸预发布14nm工艺的ISP芯片
  9. 【SDK】01 支付宝当面付 - 沙箱环境
  10. stm32晶振工作一段时间停振