命题:将一个文件中的内容复制到另一个文件中进行保存

首先分析命题可以知道,复制的操作,使用到的是Linux中的read,write,lseek等操作,因此本文章着重使用这三个函数进行文件的复制

作者在这里顺便使用了Makefile,shell脚本来帮助快速编译,为了让读者看到更加清晰的Makefile含义,本文使用最笨的方法来进行编写。


从上面可以看到作者设置了5个文件,其中test.c为复制的程序,被复制的文件为uart_test.c,复制保存的文件为:out.c,test.o和test是执行shell脚本时候生成的文件。


1.创建Makefile文件,Ubuntu中的命令:vim Makefile



2.撰写shell的脚本文件



3.撰写test.c进行具体的复制操作

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>#define BUFFSIZE       512
#define ERRORMSG()     {printf("Line %d:operation failed\n",__LINE__);}
#define SUCCESSMSG()   {printf("operation successfully\n");}int main(int argc,char *argv[])
{int inFd = -1;char fileBuf[BUFFSIZE];memset(fileBuf,0,sizeof(fileBuf));inFd = open("./uart_test.c",O_RDONLY);if(-1 == inFd){ERRORMSG();return -1;}SUCCESSMSG();int outFd = -1;outFd = open("./out.c",O_CREAT|O_TRUNC|O_WRONLY,0777);if(-1 == outFd){ERRORMSG();return -1;}SUCCESSMSG();int retData  = 0;while(retData = read(inFd,fileBuf,BUFFSIZE-1)){static int ret = 0;ret += retData;lseek(inFd,SEEK_SET,ret);printf("%s",fileBuf);write(outFd,fileBuf,strlen(fileBuf));memset(fileBuf,0,BUFFSIZE);}close(outFd);close(inFd);return 0;
}

分析上面的程序中需要注意的是,在read的时候,为了保证读取的数据都是完整的,必须保证在数组缓冲区中不会造成越界的情况,因此读取的内容是数组(长度-1)的长度,这时候数组会自动在数组尾部自动添加结束符号'\0',保证内存不溢;另一个原因是,如果不做上述的处理,编译器可能不会发出警告,但是读取到的内容在数组空间的末尾位置产生乱码,这是因为结束码影响的,同时即使设置了如:fileBuf[strlen(fileBuf)-1] = '\0',这样的话,虽然可以保证安全,但是必然丢失数据。

lseek是用来设置指针的偏移量的,读取数据的指针必须跟着已经读取的内容进行变化,否则容易造成重复复制动作

write用来把数据写进一个文档中

4.最后使用diff来检测是否完整复制(如果复制完整,不会提示什么,否则,将会输出不同的信息)

以上便是一个简单的复制文件的操作

Linux C语言中的read write lseek的使用相关推荐

  1. 关于Linux—C语言中的bool类型

    关于Linux c语言中的bool数据类型 bool类型属于基本数据类型,其类型名称为bool,值域为非零(true)和零(false).如果我们不加入其他的头文件bool类型是会报错的.bool类型 ...

  2. Linux. C语言中else,if else用法详解,C语言if else用法完全攻略

    if else 语句是一种选择结构,可以让代码选择执行.所谓选择执行,就是"某些代码可能执行,也可能不执行,有选择地执行某些代码". if 的最简单用法 if最简单的格式是: if ...

  3. Linux c语言中的IO -- 文件IO

    文章目录 1. 文件IO 2. 文件描述符 什么是文件描述符?文件描述符何时产生? 3. 文件IO常用函数 open() close() 对比fopen()与open()打开文件权限 read() w ...

  4. Linux C语言中的IO--标准IO

    文章目录 1. IO概述 系统调用和库函数有什么区别? 2. 标准IO 2.1 缓冲区 / 缓存区 行缓冲区刷新方法 全缓冲区刷新方法 2.2 文件指针 2.3 标准IO常用函数 fopen() fc ...

  5. Linux. C语言中else,2. if/else语句

    2. if/else语句 if语句还可以带一个else子句(Clause),例如:if (x % 2 == 0) printf("x is even.\n"); else prin ...

  6. Linux C语言中access函数的用法

    access()函数的用法:int access(const char *filenpath, int mode) 一.access()函数的作用 access()函数用来判断某个指定路径的文件(第一 ...

  7. c语言中open函数r,C语言中open函数

    语法Open ( windowvar, windowtype {, parent } ) 参数windowvar:指定窗口变量名,Open()函数把打开窗口的引用放置到该变量中windowtype:s ...

  8. c语言中open的原理,C语言中open函数

    语法Open ( windowvar, windowtype {, parent } ) 参数windowvar:指定窗口变量名,Open()函数把打开窗口的引用放置到该变量中windowtype:s ...

  9. linux c语言 getline,C语言中getline()函数的深入理解

    我在网上搜了半天getline()函数,大多针对C++的,重载函数比较多,云里雾里的,而且没有实例,反正就是没有自己所需要的getline()函数.所以,自己在Linux下man了一把,并做了测试.g ...

最新文章

  1. 计算机网络智能化在铁路通信的发展,计算机网络在铁路信号中的应用
  2. 【转】HTML全解(1)
  3. java中xpath_java-xpath学习
  4. 37个JavaScript基本面试问题和解答
  5. Java_输出60的十六进制
  6. mysql 时间序列可视化工具_mysql – 从from到to条目创建时间序列
  7. LeetCode刷题——125. 验证回文串
  8. 教你一招!在Mac上使用自带的程序创建加密的文件磁盘
  9. C++ float、double判断是否等于0
  10. python 3.5版本安装landsat-uti包
  11. IIS、MySQL、Redis环境搭建
  12. 车载电子电器防水防尘等级介绍
  13. Java基础 第一节 第一课
  14. 002_SSSS_ Denoising Diffusion Implicit Models
  15. 『杭电1859』最小长方形
  16. python 函数与部分使用示例
  17. interrupt()方法理解和实例
  18. webSocket配置wss访问
  19. 刘知远 | 语义表示学习
  20. 想让AI变现?这六大市场营销场景不容忽视

热门文章

  1. 论文精翻《Progressive Tandem Learning for Pattern Recognition With Deep Spiking Neural Networks》
  2. pat L1-047装睡(python3)
  3. 17万字 JUC 看这一篇就够了(三) (精华)
  4. 平场校正 Flat Fielding
  5. 《文献管理与信息分析》——学习笔记1
  6. C语言实现八大排序算法详解及其性能之间的
  7. java配置jetty_Jetty的配置
  8. SQL Server账号密码(sa)登录失败 错误原因:233
  9. 计算机中常见乱码原因及分析
  10. 小米6的无线网连接到服务器,小米手机WIFI上网设置教程