基于Linux系统文件操作超详细版
一 linux系统编程1.linux系统架构1用户空间应用空间2内核空间驱动--------本质上是用来驱动硬件的软件程序操作系统------软件和硬件的大管家系统调用 ------向用户空间提供内核功能的接口以函数的的方式提供使用接口应用程序使用到内核功能完成自己的功能要使用系统调用实现应用程序两条路径1直接使用系统调用2借助第三方库来实现二 库函数文件编程如何来操作文件strace 跟踪到系统调用strace ./a.outlinux系统的七种文件类型b --------block-------- 块设备文件 ls -l /dev/sdac---------char--------- 字符设备文件 ls -l /dev/input/mouse0d ---------directory ------目录文件- ---------regular-------- 常规文件I ---------symblink -------软连接文件 eg . ln -s day1/ dirs ---------socket ---------- 套接字文件p ----------pipe ------------管道文件 mkfifo pipels -l--------------------------------------------------------------------------------1. 打开文件1.fopenFILE *fopen(const char *pathname, const char *mode)功能流打开函数打开文件打开pathname指定的一个文件并关联一个流给这个文件参数pathname 是一个文件名的字符串moder 打开文件做读操作r 对文件进行读写操作w 只写------如果文件存在则清0不存在则创建w 读写a 追加从末尾写 文件不存在则会创建a 读写读---从头读 写----从末尾写返回值成功时返回FILE *指针即FILE的地址-----流指针或文件指针FILE *fp fopen(1.txt,r);此时操作fp就相当于操作文件失败时返回NULL#includestdio.h #includefcntl.h int main(int argc, const char *argv[]) { FILE *fp fopen(1.txt,r); if(fp NULL) { printf(fopen faile); return -1; } printf(fopen success!\n); return 0; }出错信息打印函数perror(自定义字符串);输出效果 自定义字符串错误原因errno 是全局变量的一个错误码变量#includestdio.h #includefcntl.h int main(int argc, const char *argv[]) { FILE *fp fopen(1.txt,r); if(fp NULL) { // printf(fopen faile); perror(fopen faile); return -1; } printf(fopen success!\n); return 0; }出错时2.读写1 fgetcint fgetc(FILE *stream)功能单个字符输入函数参数stream 表示要进行读取的文件文件指针返回值成功 返回读到的字符字符的ASCII失败 EOF //-1到达文件末尾也返回EOFend of file系统中默认打开了三个文件标准输入 -------stdin //鼠标键盘标准输出 --------stdout //输出标准出错 --------stderr#includestdio.h int main(int argc, const char *argv[]) { int ret fgetc(stdin); printf(ret %c:%d\n,ret ,ret); return 0; }运行结果练习cat1 打开文件------FILE *fp2 fgetcfp#includestdio.h int main(int argc, const char *argv[]) { if(argc ! 2) { return -1; } FILE *fp fopen(argv[1],r); while(1) { int ret fgetc(fp); if(ret EOF) break; printf(%c,ret); } }运行结果2fcloseint fclose(FILE *stream);功能关闭流并释放相关内存空间参数 stream 要关闭的流返回值成功时返回0失败时返回EOF 并且 errno重置注意同一个文件不可以多次fclose#includestdio.h int main(int argc, const char *argv[]) { if(argc!2) //命令行参数个数 //./a.out test.txt 时argc 等于 2第1个是程序名 ./a.out第2个是文件名 test.txt { printf(Usage: %s filename\n,argv[0]); return -1; } FILE *fp fopen(argv[1],r); if(fp NULL) { perror(open fail); return -1; } while(1) { int ret fgetc(fp); if(ret EOF) break; printf(%c,ret); } fclose(fp); return 0; }结果3fputcint fputc (int c,FILE*stream)功能输出单个字符参数 c 表示要输出的字符stream 表示要输出到的文件返回值 成功返回输出的字符ASCII码值失败返回EOF#includestdio.h int main(int argc, const char *argv[]) { int ret fgetc(stdin); // printf(ret %c:%d\n,ret ,ret); fputc(ret,stderr); //出错的信息打印在stderr上 return 0; }练习cp cp 1.txt 2.txt#include stdio.h #include fcntl.h // ./a.out 1.txt 2.txt int main(int argc, const char *argv[]) { if (argc ! 3) { printf(Usage: %s src file dest file\n,argv[0]); return -1; } FILE *fp_s fopen(argv[1],r); FILE *fp_d fopen(argv[2],w); if (fp_s NULL || fp_d NULL) { perror(fopen fail); return -1; } int ret 0; while (1) { ret fgetc(fp_s); if (ret EOF) break; fputc(ret,fp_d); } fclose(fp_s); fclose(fp_d); return 0; }运行结果getc1.c 的内容被复制到了haha.c上对比两个文件 使用的命令1. vi 1.c 2.c -d //看文件的不同2. diff 1.c 2.c //看文件的不同4fgetschar *fgets(char *s,int size,FILE *stream);功能从stream中读取数据最多读取size-1个数据存放到s中参数s 保存读取结果的一块内存空间size 表示一次最多读取多少个字符stream 要读取的文件返回值成功时返回s返回NULL 到达文件结尾或失败说明fgets读取结束后在读到的最后一个字符后面会加上\0读取结束的情况1 .读取到文件末尾EOF2 .读取到\n说明\n会被保存到buffer中3 .读取到size-1个字符#includestdio.h int main(int argc, const char *argv[]) { char buf[10] {1,1,1,1,1,1,1,1,1,1}; fgets(buf,sizeof(buf),stdin); printf(buf %s\n,buf); int i 0; for(i0;i10;i) { printf(buf[%d] %c:%d\n,i,buf[i],buf[i]); } return 0; }运行结果结果说明 10是输入的换行符 0是\0y练习用fgets实现cat功能#includestdio.h int main(int argc, const char *argv[]) { if(argc ! 2) { return -1; } FILE *fp_s fopen(argv[1],r); if(fp_s NULL) { printf(open fail); return -1; } while(1) { char buf[10] {0}; char *a fgets(buf,sizeof(buf),fp_s); if(a NULL) break; printf(%s,buf); } fclose(fp_s); return 0; }运行结果5fputsint fputs(const char *s, FILE *stream);功能将字符串s写入流stream参数s 存放要写入的字符串stream 打开的流文件6fread /fwrite按二进制流的输入和输出功能读取或写入二进制数据参数ptr 保存数据一块空间size 单个元素的大小nmemb 元素的个数stream 要操作的文件返回值成功 返回读取到或写入的元素个数失败 04.定位函数1.fseekint fseek(FILE *stream,long offset,int whence)功能定位文件参数*stream ---要定位的文件offset ---文件偏移量可正可负 参考点为文件开头就不可以为负whence ---参考点SEEK_SET //表示相对于文件开头的SEEK_ CUR //相当于文件当前的SEEK_END //相对于文件末尾的偏移量返回值 成功 0失败 -1 errno会被设置egfseek(fp,0,SEEK_SET); 定位到文件开头fseek(fp,100,SEEK_SET); 从头偏移100个字节2空洞文件 --------填充的全是0 用途抢占磁盘空间创建方式1.偏移2.做一次写操作#includestdio.h int main() { FILE *fp fopen(h.txt,w); if(fp NULL) { perror(fopen fail); return -1; } fseek(fp,100,SEEK_SET); fput(A,fp); return 0; } //生成的空洞文件2ftelllong ftell(FILE *stream);3fwindvoid rewind(FILE *stream)练习fread fwrite 实现cat功能#includestdio.h int main(int argc, const char *argv[]) { if(argc ! 2) { return -1; } FILE *fp fopen(argv[1],r); if( fpNULL) { perror(open fail); return -1; } while(1) { char buf[99]; int ret fread(buf,sizeof(char),99,fp); if(ret 0) break; fwrite(buf,sizeof(char),ret,stdout); } fclose(fp); return 0; }//将三个学生信息打印到文件中再读取三个学生信息 #includestdio.h typedef struct stu { char name[20]; int sno; float score; }stu_t; int main(int argc, const char *argv[]) { stu_t s[3] {{Tom,110,99.5},{Jerry,111,89.8},{XiaoMing,112,100}}; FILE *fp fopen(stu.txt,w); if (fp NULL) { perror(fopen fail); return -1; } int ret fwrite(s,sizeof(stu_t),3,fp); printf(ret %d\n,ret); fseek(fp,0,SEEK_SET); fflush(fp); getchar(); #if 0 fclose(fp); FILE *fp1 fopen(stu.txt,r); if (fp NULL) { perror(fopen fail); return -1; } #endif fseek(fp,0,SEEK_SET); stu_t s1[3]; ret fread(s1,sizeof(stu_t),3,fp); perror(fread fail); printf(ret %d\n,ret); int i 0; for (i 0; i 3; i) { printf(name : %s\n,s1[i].name); printf(sno : %d\n,s1[i].sno); printf(score : %.2f\n,s1[i].score); } return 0; }练习用fread 和 fwrite 实现文件拷贝#includestdio.h int main(int argc, const char *argv[]) { if(argc ! 3) { return -1; } FILE *fp_s fopen(argv[1],r); FILE *fp_d fopen(argv[2],w); if( fp_s NULL || fp_d NULL) { perror(open fail); return -1; } while(1) { char buf[99]; int ret fread(buf,sizeof(char),99,fp_s); if(ret 0) break; fwrite(buf,sizeof(char),ret,fp_d); } fclose(fp_s); fclose(fp_d); return 0; }搭建一个和原文件一样大小的空洞文件再进行拷贝#includestdio.h int main(int argc, const char *argv[]) { if(argc ! 3) { return -1; } FILE *fp_s fopen(argv[1],r); FILE *fp_d fopen(argv[2],w); if( fp_s NULL || fp_d NULL) { perror(open fail); return -1; } //获取原文件大小 fseek(fp_s,0,SEEK_END); long len ftell(fp_s); //创建空洞文件 fseek(fp_d,len-1,SEEK_SET); fputc(\0,fp); getchar(); fflush(fp_d); //拷贝 rewid(fp_s); char buf[len]; fread(buf,sizeof(buf),1,fp_s); fread(buf,sizeof(buf),1,fp_d); fclose(fp_s); fclose(fp_d); return 0; }三 文件IO----系统调用1.打开1openint open(const char *pathname,int flagsint mode);功能打开一个文件获得一个文件描述符参数pathname 文件名flags必须项O_RDONLY // 只写O_WRONLY //只读O_RDWR //读写可选项O_APPENDO_CREATE //创建文件O_EXCL //和O_EXCL同时使用表示新建的文件不存在成功否则open失败O_TRUNC //内容清空mode:模式 --------对应的是文件的权限------用来指定创建文件时的权限只有flags中出现O_CREAT时用rw- rw- r-- //八进制数值表示权限110 110 100 ----------0664所属于主的权限所属组的权限其他人的权限r--read w--write x--eXcute返回值成功时返回文件描述符失败时-1 errno#includestdio.h #includefcntl.h int main(int argc, const char *argv[]) { int fd open(1.txt,O_RDONLY); if(fd0) { perror(open fail); return -1; } printf(fd %d\n,fd); return 0; }运行结果2.读写1read write#includeunistd.hssize_t read (int fd,void *buf, size_t count);ssize_t write (int fd,const void *buf, size_t count);功能 读或写参数fd 要操作的文件buf 存放数据的一块空间的地址count 一次 读 或 写 的字节数返回值成功 成功读取或写入的字节数失败 -1 error读取时返回值为0表示到达文件末尾#includestdio.h #includeunistd.h int main(int argc, const char *argv[]) { char buf[1024]; int ret read(0,buf,sizeof(buf)); //0在这里相当于stdin printf(ret %d buf %s\n,ret,buf); return 0; }运行结果#includestdio.h #includeunistd.h int main(int argc, const char *argv[]) { char buf[1024]; int ret read(0,buf,sizeof(buf)); //0在这里相当于stdin // printf(ret %d buf %s\n,ret,buf); write(1,buf,ret); //1相当于stdout return 0; }练习用read 和 write 实现cat 功能#includestdio.h #includefcntl.h #includeunistd.h int main(int argc, const char *argv[]) { if(argc ! 2) { return -1; } int fp open(argv[1],O_RDONLY); if(fp0) { perror(open fail); return -1; } char buf[1024]; int ret 0; while(1) { ret read(fp,buf,sizeof(buf)); //0在这里相当于stdin if(ret 0) break; write(1,buf,ret); //1相当于stdout } return 0; }运行结果练习用read write 实现copy功能#includestdio.h #includeunistd.h #includefcntl.h int main(int argc, const char *argv[]) { if(argc ! 3) { return -1; } int fp open(argv[1],O_RDONLY); if(fp -1) { return -1; } int fd open(argv[2],O_WRONLY|O_CREAT,0664); if(fd -1) { return -1; } while(1) { char buf[1024]; int ret read(fp,buf,sizeof(buf)); if(ret 0) break; write(fd,buf,ret); } return 0; }运行结果buchong.c 被复制到了xixi.c里面3.关闭1fclose用法就是调用 fclose(要关闭的文件名)4.定位函数1lseekoff_t lseek (int fd,off_t offset, int whence);功能文件定位参数fd 要定位的文件描述offset 偏移量whence 参考点SEEK_SETSEEK_CURSEEK_END返回值成功返回偏移量的值失败 -1 和 errno使用例子1 .定位到文件开头lseek(fd,0,SEEK_SET);2 .获取到文件大小off_t len lseek(fd,0,SEEK_END); 返回偏移量就是文件的大小3.创建空洞文件#includestdio.h #includefcntl.h #includeunistd.h int main(int argc, const char *argv[]) { if(argc ! 3) { return -1; } int fd open(argv[1],O_RDONLY); int fs open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0666); if(fd 0 || fs 0) { return -1; } //获取原文件大小 off_t len lseek(fd,0,SEEK_END); //创建空洞文件 lseek(fs,len-1,SEEK_SET); write(fs,,1); close(fd); close(fs); return 0; }使用标准IO的函数想要使用read write时fd-filenoint filemo(FILE *stream)FILE *fdopen(int fd,const char *mode)使用#includestdio.h #includefcntl.h int main(int argc, const char *argv[]) { int fd open(1.txt,O_RDONLY); if(fd 0) { return -1; } printf(fd %d\n,fd); FILE *fp fdopen(fd,r); if(fp NULL) { return -1; } return 0; }int feof (FILE *stream);检测指定文件流的“文件结束指示器”End-of-File indicator是否已被设置。int ferror(FILE *stream);检测指定文件流是否发生了“读写错误”I/O Error并检查其“错误指示器”Error indicator是否被设置。#includestdio.h #includefcntl.h int main(int argc, const char *argv[]) { int fd open(1.txt,O_RDONLY); if(fd 0) { return -1; } printf(fd %d\n,fd); FILE *fp fdopen(fd,r); if(fp NULL) { perror(fdopen fail); return -1; } char buf[100]; while(1) { char *ret fgets(buf,sizeof(buf),fp); if(ret NULL) { if(feof(fp)) { perror(fgets fail); break; }else if(ferror(fp)) { perror(fgets fail); break; } } printf(buf %s\n,buf); } return 0; }

相关新闻

工商服务小程序开发公司有哪些?哪个更适合零基础新手?

工商服务小程序开发公司有哪些?哪个更适合零基础新手?

工商服务小程序开发公司有哪些?哪个更适合零基础新手?先看一组数据。据艾瑞咨询2025年Q3《中国小程序市场研究报告》,中国小程序市场规模已达到4200亿元,同比增长38%,企业渗透率达68%。截至2025年第三季度,…

2026/10/7 22:21:32 阅读更多 →
破解物理AI技术困局(37):TVA攻克多智能体协同难题

破解物理AI技术困局(37):TVA攻克多智能体协同难题

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”或“TVA视觉智能体”)是依托Transformer架构与“因式智能体”理论构建的通用视觉技术框架。它融合深度强化学习(DRL)、卷积神经…

2026/10/13 3:52:13 阅读更多 →
056、空间降噪的“保边困境“——NLM/Bilateral/Guided Filter在纹理细节与噪声抑制之间的取舍及参数调优心法

056、空间降噪的“保边困境“——NLM/Bilateral/Guided Filter在纹理细节与噪声抑制之间的取舍及参数调优心法

056、空间降噪的"保边困境"——NLM/Bilateral/Guided Filter在纹理细节与噪声抑制之间的取舍及参数调优心法 上个月在调试一款车载夜视系统的时候,客户反馈了一个特别刁钻的问题:车辆在高速上跑,路灯下树影斑驳的路面被降噪算法磨得干干净净,但驾驶员抱怨"…

2026/9/25 13:09:53 阅读更多 →

最新新闻

稳定细胞系构建与高表达克隆筛选:从瞬时转染到稳定株的完整指南

稳定细胞系构建与高表达克隆筛选:从瞬时转染到稳定株的完整指南

上个月接了一个蛋白药物早期研发的需求。对方上来就问:稳定细胞系构建怎么收费,能不能顺便帮筛几个高表达克隆。多聊了几句我才搞清楚,他们刚用瞬时转染跑完一轮预实验,分泌量看着不错,团队内部已经把预算和排期都排到…

2026/10/14 10:11:49 阅读更多 →
PTA C++编程题解题攻略:常见题型与踩坑经验总结

PTA C++编程题解题攻略:常见题型与踩坑经验总结

1. 拿到PTA编程题,先别急着敲代码这些年我在某高校带过好几轮C上机课,也帮着学弟学妹们辅导过不少PTA的作业题,发现大多数人卡住的原因其实不是代码能力不够,而是打心底里没把“编程题”当成一道需要审题、拆解的工程题来做。大一…

2026/10/14 10:11:49 阅读更多 →
自托管PS5游戏库与硬件维护:一个极简Web面板的设计实践

自托管PS5游戏库与硬件维护:一个极简Web面板的设计实践

任何一台PS5,玩久了都会攒出一堆散乱的数字资产:买过的游戏、还没补的DLC、借给朋友的光盘、上次清灰的时间、某个账号里卡在80%的奖杯列表。身边不少人用Excel或者手机备忘录在记,但一旦跨设备、跨主机、跨朋友借还,很快就乱成一…

2026/10/14 10:11:49 阅读更多 →
LiteLLM实战:统一大模型API接入与代理网关部署指南

LiteLLM实战:统一大模型API接入与代理网关部署指南

如果你手上同时要接好几家大模型的 API,估计你早就被“每家一套请求格式、鉴权方式、限流策略”磨到没脾气。litellm就是干这个的:一个 Python 库,也是一个可以独立部署的代理网关,把各家大模型接口统一成一套调用方式&#xff0c…

2026/10/14 10:11:49 阅读更多 →
Excel SUMIFS函数详解:多条件求和高阶技巧

Excel SUMIFS函数详解:多条件求和高阶技巧

1. 为什么需要SUMIFS函数? 刚接触Excel那会儿,我经常被各种销售报表折磨得焦头烂额。记得有次老板让我统计"华东地区手机品类在Q2的销售额",我硬是用了三个辅助列才勉强算出来。直到后来发现了SUMIFS这个神器,才发现原来…

2026/10/14 10:11:49 阅读更多 →
Django+Flask智能营销系统:银行数字化转型实战

Django+Flask智能营销系统:银行数字化转型实战

1. 项目背景与核心价值在金融数字化转型浪潮中,银行业务营销正从传统人工经验驱动转向数据智能驱动。这个基于DjangoFlask的智能营销系统,正是利用爬虫技术获取多维金融数据,通过大数据分析生成客户画像,最终以可视化大屏呈现营销…

2026/10/14 10:10:46 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →