网站个人备案流程,wordpress怎么改导航,南宁软件优化网站建设,中国招投标网站官网文章目录 文件操作总结预备知识结论: C文件操作回顾语言方案w写入方式a写入方式r只读方式 系统方案但是这个**没有设置权限**,需要这样改: 文件操作总结 1.文件描述符,重定向,缓冲区,语言和系统关于文件的不同的视角的理解 – 都是要让我们深刻理解文件 2.文件系统 3.动静态库 … 文章目录 文件操作总结预备知识结论: C文件操作回顾语言方案w写入方式a写入方式r只读方式 系统方案但是这个**没有设置权限**,需要这样改: 文件操作总结 1.文件描述符,重定向,缓冲区,语言和系统关于文件的不同的视角的理解 – 都是要让我们深刻理解文件 2.文件系统 3.动静态库 – a.制作者的角度 b.站在使用者的角度 c.如何理解动态库加载(进程地址空间的内容) 预备知识
1.你真的理解文件原理和操作了吗?这不是语言问题,这是系统的问题 2.是不是只有c/c有文件操作呢?pytho java php go也有的,但是他们的文件操作的方法是不一样的,如何理解这种现象?有没有一种统一的视角看待所有的语言文件操作呢 3.操作文件的时候,第一件事情,都是打开文件.打开文件是做什么呢,如何理解呢 4.文件 内容 属性-针对文件的操作,对内容的操作,对属性的操作 5.当文件没有被操作的时候,文件会在磁盘上 6.当我们对文件进行操作时,文件会被放在内存上,因为冯诺依曼体系是这么规定的 7.当我们对文件进行操作时,文件需要提前被load到内存,load的是内容还是属性呢?反正至少得有属性吧 8.当我们对文件进行操作时,文件需要提前被load到内存,是不是只有你一个人在load呢?不是,内存中一定存在大量的不同文件的属性 9.综上-打开文件本质就是将我们需要的文件属性加载到内存中,OS内部一定会同时存在大量的被打开的文件,那么OS要不要管理这些被打开的文件呢?先描述,再组织!构建在内存中的文件对象结构体,struct file{就可以从磁盘来,struct file* next} ,表明被打开的文件 10.文件被打开,是谁在打开呢?OS,但是是谁让OS打开的呢? 用户(进程为代表的) 11.我们之前的所有的文件操作,都是进程和被打开文件的关系 12.进程和被打开文件的关系struct task_struct和struct file的关系
结论:
每一个被打开的文件,都要在OS内创建对应的struct结构体,可以将所有的struct file 结构体用某种数据结构链接起来,在OS内部,对被打开的文件进行管理,就被转换为了对链表的增删查改 即:文件被打开,OS要为被打开的文件创建对应的内核结构
struct file
{//各种属性//各种链接关系
}文件其实可以被分成两大类:磁盘文件,被打开的文件(内存文件)
C文件操作回顾
语言方案
w写入方式
w: 默认写方式打开文件,如果文件不存在,就创建它 1.默认如果只是打开,文件内容会自动清空 2.同时,每次进行写入的时候,都会从最开始进行写入 先清空,再写入
#includestdio.h
#define LOG log.txt
int main()
{FILE* fp fopen(LOG,w);if(fp NULL){return perror(fopen);//fopen:xxxxreturn 1; }//正常进行文件操作const char* msg hellp lx,hello 2023\n;int cnt 5;while(cnt){char buffer[256];//int fprintf(FILE* stream,const char* format,...)//指定文件流,向指定文件打印fprintf(fp,%s:%d:lx\n,msg,cnt)//往文件中输入fprintf(stdout,%s:%d:lx\n,msg,cnt)//linux一切皆文件,stdout对应显示器文件 snprintf(buffer,sizeof(buffer),%s:%d:lx\nmsg,cnt);//输入到自定义缓冲区中fputs(buffer,fp);//fputs(msg,fp);cnt--;}fclose(fp);return 0;
}a写入方式
不会清空文件,而是每一次写入都是从文件结尾写入的,即追加
#includestdio.h
#define LOG log.txt
int main()
{FILE* fp fopen(LOG,a);if(fp NULL){return perror(fopen);//fopen:xxxxreturn 1; }//正常进行文件操作const char* msg aaa\n;int cnt 5;while(cnt){fputs(msg,fp);cnt--;}fclose(fp);return 0;
}r只读方式
int main()
{FILE* fp fopen(LOG,r);if(fp NULL){return perror(fopen);//fopen:xxxxreturn 1; }//正常进行文件操作while(1){char line[128];if(fgets(line,sizeof(line),fp) NULL) break;else {printf(%s\n,line);}}fclose(fp);return 0;
}系统方案
#includestdio.h
#includesys/types.h
#includesys/stat.h
#includefcntl.h
#includeunistd.h
#includeerrno.h
#includestring.h
#define LOG log.txt
int main()
{//fd:文件描述符int fd open(LOG, O_WRONLY | O_CREAT);if(fd -1){printf(fd:%d,errno:%d,errorstring:%s\n,fd,errno,strerror(errno));}else printf(fd:%d,errno:%d,errorstring:%s\n,fd,errno,strerror(errno));close(fp);return 0;
}但是这个没有设置权限,需要这样改:
//写和读//头文件不变
int main()
{//fopen(LOG,w);umask(0);//文件权限受掩码的影响//fd:文件描述符//O_CREAT和O_WRONLY不对原始内容清空int fd open(LOG, O_WRONLY | O_CREAT| O_TRUC, 0666);if(fd -1){printf(fd:%d,errno:%d,errorstring:%s\n,fd,errno,strerror(errno));}else printf(fd:%d,errno:%d,errorstring:%s\n,fd,errno,strerror(errno));//C语言,和这个接口的关系是什么呢?//C标准库函数底层是调用系统调用const char *msg hello lx,hollo world;int cnt 5;while(cnt){char line[128];snprintf(line,sizeof(line),%s,%d\n,msg,cnt);write(fd,line,strlen(line));//这里的strlen不应该加1,因为\0结尾是C语言的规定,不是文件的规定!}close(fp);return 0;
}//追加(且)写入int fd open(LOG, O_WRONLY | O_APPEND | O_CREAT, 0666);if(fd -1){printf(fd:%d,errno:%d,errorstring:%s\n,fd,errno,strerror(errno));}else printf(fd:%d,errno:%d,errorstring:%s\n,fd,errno,strerror(errno));//读取文件(r)int fd open(LOG, O_RDONLY);if(fd -1){printf(fd:%d,errno:%d,errorstring:%s\n,fd,errno,strerror(errno));}else printf(fd:%d,errno:%d,errorstring:%s\n,fd,errno,strerror(errno));char buffer[1024];// 这里我们无法做到按行读取,我们是整体读取的size_t n read(fd,buffer,sizeof(buffer - 1));//使用系统接口进行IO时,一定要注意\0问题if(n 0){buffer[n] \0;printf(%s\n,buffer);} 未完待续…