dede做招聘网站做易拉宝的素材网站
2026/2/1 14:08:49 网站建设 项目流程
dede做招聘网站,做易拉宝的素材网站,中国新闻社总编辑,软文关键词排名推广Linux文件IO与标准IO详解#xff1a;从概念到实战 一、核心概念#xff1a;文件IO vs 标准IO 1.1 基本定义 文件IO#xff08;系统调用#xff09;#xff1a;操作系统为用户操作文件提供的底层系统函数#xff08;如open/read/write/close#xff09;#xff0c;直…Linux文件IO与标准IO详解从概念到实战一、核心概念文件IO vs 标准IO1.1 基本定义文件IO系统调用操作系统为用户操作文件提供的底层系统函数如open/read/write/close直接和内核交互也叫「低级IO」。标准IOC库函数C语言标准库封装的文件操作函数如fopen/fread/fwrite/fclose底层调用文件IO跨平台性更强也叫「高级IO」。1.2 底层关系与核心区别C库函数是对系统调用的封装标准IO为了提升效率增加了用户态缓存而文件IO无缓存直接操作内核态两者的核心区别可总结为特性文件IO系统调用标准IOC库操作接口open/read/write/close/lseekfopen/fread/fwrite/fclose/fseek标识类型文件描述符int如0/1/2分别对应stdin/stdout/stderr文件流指针FILE*缓存机制无缓存直接操作内核带用户态缓存减少系统调用次数跨平台性依赖操作系统如Linux特有跨平台符合C标准适用场景设备文件、实时性要求高的场景普通文件、追求效率的通用场景权限控制打开时直接指定如0666依赖fopen模式如r二、文件IO系统调用实战文件IO是Linux内核提供的底层接口无缓存、功能强大适合对设备/实时性要求高的场景核心函数包括open/read/write/lseek/close。2.1 open打开/创建文件open函数用于打开或创建文件返回唯一的文件描述符fd失败返回-1。#includefcntl.h#includesys/stat.h#includesys/types.hintopen(constchar*pathname,intflags,intmode);参数说明pathname文件路径/名称flags打开模式核心O_RDONLY只读/O_WRONLY只写/O_RDWR读写扩展O_CREAT创建/O_TRUNC清空/O_APPEND追加mode创建文件时的权限如0666表示所有用户可读可写。实战示例01open.c创建并清空1.txt文件#includefcntl.h#includesys/stat.h#includesys/types.h#includestdio.hintmain(intargc,char**argv){// 以只写模式打开不存在则创建存在则清空权限0666intfdopen(1.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);if(-1fd)// 错误处理文件描述符返回-1表示失败{fprintf(stderr,open error\n);return1;}return0;}2.2 read/write读写文件文件IO的读写通过read读和write写实现直接操作字节流无缓存。1write写入文件ssize_twrite(intfd,constvoid*buf,size_tcount);fd目标文件描述符buf待写入数据的缓冲区count待写入的有效字节数返回值成功返回实际写入字节数失败返回-1。实战示例04write.c向1.txt写入hello#includefcntl.h#includesys/stat.h#includesys/types.h#includestdio.h#includeunistd.h#includestring.hintmain(intargc,char**argv){intfdopen(1.txt,O_WRONLY|O_CREAT|O_TRUNC,0666);if(-1fd){fprintf(stderr,open error\n);return1;}charstr[100]hello;// 关键用strlen(str)而非sizeof(str)避免写入空字符ssize_tretwrite(fd,str,strlen(str));printf(写入了%ld字节到文件,ret);// 输出写入了5字节到文件close(fd);// 必须关闭文件释放文件描述符return0;}2read读取文件ssize_tread(intfd,void*buf,size_tcount);fd源文件描述符buf接收数据的缓冲区count缓冲区最大长度返回值0实际读取字节数0文件末尾0读取失败。实战示例05read.c读取/etc/passwd文件内容#includefcntl.h#includestdio.h#includeunistd.h#includestring.hintmain(){intfdopen(/etc/passwd,O_RDONLY);// 只读打开系统文件if(-1fd){fprintf(stderr,open error\n);return1;}charbuf[50]{0};while(1){bzero(buf,sizeof(buf));// 清空缓冲区intretread(fd,buf,sizeof(buf)-1);// 留1位存\0if(ret0){break;// 读取完毕或失败退出循环}printf({%d}:{%s}\n,ret,buf);// 打印读取长度和内容}close(fd);return0;}2.3 实战案例文件拷贝06readcp.c结合read/write实现简易版cp命令核心逻辑是「循环读取源文件→写入目标文件」#includefcntl.h#includestdio.h#includesys/stat.h#includesys/types.h#includeunistd.h#includestring.hintmain(intargc,char**argv){// 检查参数需传入源文件和目标文件if(argc3){printf(usage:./a.out srcfile dstfile\n);return1;}// 打开源文件只读和目标文件只写/创建/清空intfd_srcopen(argv[1],O_RDONLY);intfd_dstopen(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666);if(-1fd_dst||-1fd_src){fprintf(stderr,open error\n);return1;}// 循环读写1024字节缓冲区提升效率while(1){charbuffer[1024]{0};intretread(fd_src,buffer,sizeof(buffer));if(ret0){break;}write(fd_dst,buffer,ret);// 按实际读取长度写入}// 关闭文件描述符close(fd_dst);close(fd_src);return0;}2.4 lseek调整文件偏移量lseek用于移动文件读写指针可实现「获取文件大小」「空洞文件创建」等功能#includefcntl.h#includestdio.h#includeunistd.h#includestring.hintmain(){intfdopen(1.txt,O_RDWR);if(-1fd){fprintf(stderr,open error\n);return1;}// 方式1获取文件大小偏移到末尾返回偏移量longsizelseek(fd,0,SEEK_END);printf(size %ld\n,size);// 方式2创建空洞文件偏移到1MB位置写入lseek(fd,1024*1024,SEEK_SET);charstr[]travel;write(fd,str,strlen(str));close(fd);return0;}2.5 标准输入输出07stdin.cLinux中0/1/2分别对应标准输入stdin、标准输出stdout、标准错误stderr可直接通过文件描述符操作#includefcntl.h#includestdio.h#includeunistd.h#includestring.h#includestdlib.hintmain(intargc,char**argv){charbuf[10]{0};printf(pls input num:);fflush(stdout);// 刷新缓存确保提示语先输出read(0,buf,sizeof(buf));// 从stdin0读取输入intnumatoi(buf);// 转为整数write(2,num,4);// 向stderr2写入整数二进制return0;}三、标准IOC库实战标准IO是C库对文件IO的封装自带缓存机制跨平台性更好核心函数包括fopen/fread/fwrite/fseek/ftell。3.1 核心函数文件读写与偏移标准IO通过FILE*指针标识文件结合fseek/ftell可轻松实现「文件插入内容」02insert.c#includestdio.h#includestring.h#includestdlib.hintmain(intargc,char**argv){FILE*fpfopen(1.txt,r);// 读写模式打开if(NULLfp){fprintf(stderr,fopen error\n);return1;}// 1. 获取文件大小偏移到末尾获取偏移量fseek(fp,0,SEEK_END);longsizeftell(fp);printf(size is %ld\n,size);// 2. 准备插入内容保存指定位置后的内容intpos15;// 插入位置charinsert_str[100]hello;fseek(fp,pos,SEEK_SET);// 偏移到插入位置char*data(char*)malloc(size);// 分配内存保存后半部分fread(data,size-pos,1,fp);// 读取后半部分内容// 3. 插入内容覆盖写入新内容原有后半部分fseek(fp,pos,SEEK_SET);fwrite(insert_str,strlen(insert_str),1,fp);// 写入插入内容fwrite(data,size-pos,1,fp);// 写入原有后半部分// 4. 释放资源fclose(fp);free(data);return0;}3.2 实战案例字典查询03dict.c结合标准IO的fgets读取文件、链表存储数据实现简易字典查询功能#includestdio.h#includestdlib.h#includestring.h#includelist.h// 字典数据结构单词释义链表节点typedefstruct{charword[50];charmean[512];structlist_headnode;}DATATYPE;// 添加单词到链表intadd_word(structlist_head*head,char*word,char*mean){DATATYPE*p(DATATYPE*)malloc(sizeof(DATATYPE));if(NULLp){fprintf(stderr,add malloc error\n);return-1;}strcpy(p-word,word);strcpy(p-mean,mean);list_add(p-node,head);// 链表插入return0;}// 查找单词DATATYPE*find_word(structlist_head*head,char*want_word){DATATYPE*pNULL;DATATYPE*nNULL;// 安全遍历链表list_for_each_entry_safe(p,n,head,node){if(0strcmp(want_word,p-word)){returnp;}}returnNULL;}intmain(intargc,char**argv){// 1. 打开字典文件FILE*fpfopen(/home/linux/dict.txt,r);if(NULLfp){fprintf(stderr,open error\n);return1;}// 2. 初始化链表读取字典文件structlist_headdict_head;INIT_LIST_HEAD(dict_head);while(1){charstr[1024]{0};if(NULLfgets(str,sizeof(str),fp))// 逐行读取{break;}// 分割单词和释义char*wordstrtok(str, );char*meanstrtok(NULL,\r);add_word(dict_head,word,mean);// 添加到链表}// 3. 交互查询单词while(1){charwant_word[50]{0};printf(pls input want_word:);fgets(want_word,sizeof(want_word),stdin);// 读取用户输入want_word[strlen(want_word)-1]\0;// 去掉换行符if(0strcmp(want_word,#quit))// 退出条件{break;}// 查找并输出结果DATATYPE*tmpfind_word(dict_head,want_word);if(NULLtmp){printf(cant find word:%s\n,want_word);}else{printf(word:%s mean:%s\n,tmp-word,tmp-mean);}}return0;}四、核心总结4.1 关键结论底层关系标准IO是文件IO的封装跨平台优先选标准IO设备/实时场景选文件IO缓存影响标准IO的缓存可减少系统调用次数提升效率文件IO无缓存实时性更高标识差异文件IO用文件描述符int标准IO用文件流指针FILE*错误处理文件IO返回-1表示失败标准IO返回NULL如fopen需严格校验返回值。4.2 选型建议操作普通文件如txt、配置文件优先标准IOfopen/fread/fwrite操作设备文件如串口、网卡优先文件IOopen/read/write需要跨平台必须用标准IO需要精准控制文件偏移/权限用文件IO。五、常见问题与注意事项文件权限open的mode参数如0666最终权限会受umask影响实际权限mode ~umask缓存问题标准IO需注意fflush刷新缓存避免数据未写入磁盘内存泄漏标准IO的malloc内存、文件描述符/流指针必须手动释放/关闭参数校验read/write的count参数需合理如read用sizeof(buf)-1避免缓冲区溢出。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询