Linux C语言中的read write lseek的使用
命题:将一个文件中的内容复制到另一个文件中进行保存
首先分析命题可以知道,复制的操作,使用到的是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的使用相关推荐
- 关于Linux—C语言中的bool类型
关于Linux c语言中的bool数据类型 bool类型属于基本数据类型,其类型名称为bool,值域为非零(true)和零(false).如果我们不加入其他的头文件bool类型是会报错的.bool类型 ...
- Linux. C语言中else,if else用法详解,C语言if else用法完全攻略
if else 语句是一种选择结构,可以让代码选择执行.所谓选择执行,就是"某些代码可能执行,也可能不执行,有选择地执行某些代码". if 的最简单用法 if最简单的格式是: if ...
- Linux c语言中的IO -- 文件IO
文章目录 1. 文件IO 2. 文件描述符 什么是文件描述符?文件描述符何时产生? 3. 文件IO常用函数 open() close() 对比fopen()与open()打开文件权限 read() w ...
- Linux C语言中的IO--标准IO
文章目录 1. IO概述 系统调用和库函数有什么区别? 2. 标准IO 2.1 缓冲区 / 缓存区 行缓冲区刷新方法 全缓冲区刷新方法 2.2 文件指针 2.3 标准IO常用函数 fopen() fc ...
- Linux. C语言中else,2. if/else语句
2. if/else语句 if语句还可以带一个else子句(Clause),例如:if (x % 2 == 0) printf("x is even.\n"); else prin ...
- Linux C语言中access函数的用法
access()函数的用法:int access(const char *filenpath, int mode) 一.access()函数的作用 access()函数用来判断某个指定路径的文件(第一 ...
- c语言中open函数r,C语言中open函数
语法Open ( windowvar, windowtype {, parent } ) 参数windowvar:指定窗口变量名,Open()函数把打开窗口的引用放置到该变量中windowtype:s ...
- c语言中open的原理,C语言中open函数
语法Open ( windowvar, windowtype {, parent } ) 参数windowvar:指定窗口变量名,Open()函数把打开窗口的引用放置到该变量中windowtype:s ...
- linux c语言 getline,C语言中getline()函数的深入理解
我在网上搜了半天getline()函数,大多针对C++的,重载函数比较多,云里雾里的,而且没有实例,反正就是没有自己所需要的getline()函数.所以,自己在Linux下man了一把,并做了测试.g ...
最新文章
- 计算机网络智能化在铁路通信的发展,计算机网络在铁路信号中的应用
- 【转】HTML全解(1)
- java中xpath_java-xpath学习
- 37个JavaScript基本面试问题和解答
- Java_输出60的十六进制
- mysql 时间序列可视化工具_mysql – 从from到to条目创建时间序列
- LeetCode刷题——125. 验证回文串
- 教你一招!在Mac上使用自带的程序创建加密的文件磁盘
- C++ float、double判断是否等于0
- python 3.5版本安装landsat-uti包
- IIS、MySQL、Redis环境搭建
- 车载电子电器防水防尘等级介绍
- Java基础 第一节 第一课
- 002_SSSS_ Denoising Diffusion Implicit Models
- 『杭电1859』最小长方形
- python 函数与部分使用示例
- interrupt()方法理解和实例
- webSocket配置wss访问
- 刘知远 | 语义表示学习
- 想让AI变现?这六大市场营销场景不容忽视
热门文章
- 论文精翻《Progressive Tandem Learning for Pattern Recognition With Deep Spiking Neural Networks》
- pat L1-047装睡(python3)
- 17万字 JUC 看这一篇就够了(三) (精华)
- 平场校正 Flat Fielding
- 《文献管理与信息分析》——学习笔记1
- C语言实现八大排序算法详解及其性能之间的
- java配置jetty_Jetty的配置
- SQL Server账号密码(sa)登录失败 错误原因:233
- 计算机中常见乱码原因及分析
- 小米6的无线网连接到服务器,小米手机WIFI上网设置教程