Linxu系统IO函数 read和write lseek
read 和 write 函数
1 /* 2 #include <unistd.h> 3 ssize_t read(int fd, void* buf, size_t count); 4 参数: 5 - fd:文件描述符,open得到的,通过这个文件描述符操作某个文件 6 - buf:读取数据存放的地方,数组的地址(传出参数:数据保存在数组中,通过数组得到数据) 7 - count:指定的数组的大小(最大范围,超过buf大小,数据截断) 8 返回值: 9 - 成功: 10 >0:返回实际的读取到的字节数 11 =0:文件已经读取完了 12 - 失败:返回-1 并且设置 errno 13 #include <unistd.h> 14 ssize_t write(int fd, const void* buf, size_t count); 15 参数: 16 - fd:文件描述符,open得到的,通过这个文件描述符操作某个文件 17 - buf:要往磁盘写入的数据,数组 18 - count:要写的数据的实际的大小 19 返回值: 20 - 成功:实际写入的字节数 21 - 失败:返回-1 并且设置 errno 22 */ 23 #include <unistd.h> 24 #include <stdio.h> 25 #include <sys/types.h> //open 26 #include <sys/stat.h> //open 27 #include <fcntl.h> //open 28 int main() 29 { 30 //1.通过open打开 english.txt 文件 31 int srcfd = open("english.txt",O_RDONLY); 32 if(srcfd == -1) 33 { 34 perror("open"); 35 return -1; 36 } 37 //2.创建一个新的文件(拷贝文件) 38 int destfd = open("cpy.txt",O_WRONLY|O_CREAT,0664);//destfd:目标文件的标识符 39 //0:普通文件 所有者可以 读写 群组可以 读写 其他只能 读取 40 //所有者(Owner)、群组(Group)和其他人(Others) 41 //每个用户组都有读取(Read)、写入(Write)和执行(Execute)文件的权限。 42 if(destfd == -1) 43 { 44 perror("open"); 45 return -1; 46 } 47 //3.频繁的读写操作 48 char buf[1024] = {0};//创建buf数组大小 1024 并初始化为0 49 int len = 0;//len = 返回具体字节的个数 50 while((len = read(srcfd,buf,sizeof(buf))) > 0) 51 { 52 write(destfd, buf, len); 53 } 54 //4.关闭文件 55 close(destfd); 56 close(srcfd); 57 return 0; 58 }
lseek
1 /* 2 标准C库的函数用 linux终端中: man 3 fseek 查询 3 #include <stdio.h> 4 int fseek(FILE* stream, long offset, int whence); 5 6 Linux系统函数 man 2 lseek 7 #include <sys/type.h> 8 #include <unistd.h> //unix的标准头文件 9 off_t lseek(int fd, off_t offset, int whence); 10 参数: 11 - fd: open 得到的 文件描述符 通过fd操作某个文件 12 - offset: 偏移量 13 - whence: 14 SEEK_SET:设置文件指针的偏移量 15 SEEK_CUR:设置偏移量,当前位置 + 第二个参数 offset 的值 16 SEEK_END:设置偏移量,文件大小 + 第二个参数 offset 的值 17 返回值:返回文件指针的位置 18 作用: 19 1.移动文件指针到文件头 20 lseek(fd, 0, SEEK_SET); 21 2.获取当前文件指针的位置 22 lseek(fd, 0, SEEK_CUR); 23 3.获取文件长度 24 lseek(fd, 0, SEEK_END); 25 4.拓展文件长度,例:当前文件10B --> 110B,增加100字节 26 lseek(fd,100,SEEK_END); 27 下载文件时候 防止内存不够 先创建拓展足够量的空间 然后下载内容 28 */ 29 #include <sys/types.h> //lseek open 30 #include <sys/stat.h> //open 31 #include <unistd.h> //lseek 32 #include <fcntl.h> //open 33 #include <stdio.h> //perror 34 35 int main() 36 { 37 int fd = open("hello.txt",O_RDWR); 38 if( fd == -1) 39 { 40 perror("open"); 41 return -1; 42 } 43 //拓展文件的长度 44 int ret = lseek(fd,100,SEEK_END); 45 if(ret == -1) 46 { 47 perror("lseek"); 48 return -1; 49 } 50 //写入一个空数据 拓展失败 11 + 100 + 1(原先11 拓展100 写入1 ) 51 write(fd," ",1); 52 //关闭文件 53 close(fd); 54 return 0; 55 }
112:11 + 100 + 1(原先11 拓展100 写入1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了