当前位置: 首页 > news >正文

做棋牌网站建设哪家便宜宁波seo软件免费课程

做棋牌网站建设哪家便宜,宁波seo软件免费课程,apmserv网站模板,h5网站免费建设目录 预备知识 复习C文件IO相关操作 printf相关函数 fprintf snprintf 读取文件 系统文件IO操作 open函数 umask()函数 open函数返回值 预备知识 1.你真的理解文件原理和操作了吗?不是语言问题,是系统问题2.是不是只有C/C有文件操作呢&#x…

目录

预备知识

复习C文件IO相关操作

printf相关函数

fprintf

snprintf

读取文件

系统文件IO操作

open函数

umask()函数

open函数返回值

预备知识

1.你真的理解文件原理和操作了吗?不是语言问题,是系统问题
2.是不是只有C/C++有文件操作呢? 不是,Java,python,go都有,他们的文件操作方法是不一样的?如何处理这种现象呢? 有没有一种统一的视角,看待所有的语言文件从操作呢?
3.操作文件的时候,第一件事情,就是打开文件,打开文件时做什么呢?如何理解呢?
4.文件 = 内容 + 属性 -> 针对文件的操作,对内容的操作,对属性的操作
5.当文件没有被操作的时候,文件一般会在什么位置磁盘
6.当我们对文件进行操作的时候,文件需要在哪里 内存,为什么呢? 因为CPU和内存交互
7.当我们对文件进行操作的时候,文件需要提前被load到内存,load是内容还是属性属性,因为一个文件至少得有属性
8.当我们对文件进行操作的时候,文件需要提前被load到内存,是不是只有你一个人在load呢?不是,内存中一定存在大量的不同文件的属性
9.所以综上,打开文件本质就是将需要的文件属性加载到内存中,OS内部一定会同时存在大量的被打开的文件,那么操作系统要不要管理这些被打开的文件呢? 要,OS需要先描述,在组织。
先描述,构建在内存中的文件结构体struct file{struct file* next},就可以从磁盘来,被打开的文件
a.每一个被打开的文件,都要在OS内对应文件对象的struct结构体,可以将所有的struct file结构体用某种数据结构链接起来--,在OS内部,对被打开的文件进行管理,就被转换成为了对链表的增删查改。
结论:文件被打开,OS要为被打开的文件,创建对应的内核数据结构
struct file
{
//各种属性
//各种链接关系
}
10.文件其实可以被分开两大类:磁盘文件,被打开的文件(内存文件)
11.文件被打开,是谁打开呢?OS,但是是谁让OS打开的呢?用户(进程为代表的)
12.我们之前的所有的文件操作,都是进程和被打开文件的关系
13.都是进程和被打开文件的关系:struct stak_structstruct file

复习C文件IO相关操作

下面是用C语言实现对文件log.txt进行操作:

#include <stdio.h>
#define LOG "log.txt"int main()
{// w:默认写方式打开文件,如果文件不存在,就创建它// 默认如果只是打开,文件内容会自动被清空// 同时,每次进行写入的时候,都会从最开始进行写入FILE *fp = fopen(LOG, "w");if (fp == NULL){perror("fopen fail");return 1;}// 正常进行文件操作const char *msg = "hello linux\n";int cnt = 5;while (cnt){fputs(msg, fp);cnt--;}fclose(fp); // 关闭文件return 0;
}

成功创建了log.txt文件,打开文件

printf相关函数

printf 默认是向显示器读取

int main()
{// w:默认写方式打开文件,如果文件不存在,就创建它// 1. 默认如果只是打开,文件内容会自动被清空// 2. 同时,每次进行写入的时候,都会从最开始进行写入FILE *fp = fopen(LOG, "w");if (fp == NULL){perror("fopen fail");return 1;}// 正常进行文件操作const char *msg = "hello linux";int cnt = 5;while (cnt){fprintf(fp, "%s:%d:phw\n", msg, cnt);cnt--;}fclose(fp); // 关闭文件return 0;
}

fprintf

fprintf(stdout, "%s:%d:phw\n", msg, cnt); // Linux一切皆文件,stdout也对应一个文件,显示器文件

snprintf

写入到buffer缓冲里

下面测试一下将msg改成phw

这里得出结论, “w"为覆盖式写入

追加式写入"a"选项

读取文件

系统文件IO操作

open函数

pathname: 要打开或创建的目标文件

flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
参数:
 O_RDONLY: 只读打开
 O_WRONLY: 只写打开
 O_RDWR : 读,写打开
 这三个常量,必须指定一个且只能指定一个
 O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
 O_APPEND: 追加写

 O_TRUNC:清空文件内容
返回值:
 成功:新打开的文件描述符
 失败:-1

下面是标志位的举例程序:

#define ONE 0x1
#define TWO 0x2
#define THREE 0x4
#define FOUR 0X8
#define FIVE 0X10void Print(int flags)
{if (flags & ONE)printf("hello 1\n");if (flags & TWO)printf("hello 2\n");if (flags & THREE)printf("hello 3\n");if (flags & FOUR)printf("hello 4\n");if (flags & FIVE)printf("hello 5\n");
}int main()
{printf("-------------------\n");printf(ONE);printf("-------------------\n");printf(TWO);printf("-------------------\n");printf(FOUR);printf("-------------------\n");printf(ONE | TWO);printf("-------------------\n");printf(ONE|TWO|THREE);printf("-------------------\n");printf(ONE|TWO|THREE|FOUR|FIVE);printf("-------------------\n");return 0;
}

 

open函数测试:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define LOG "log2/txt"// 系统方案
int main()
{int fd = open(LOG, O_WRONLY);printf("fd:%d\n", fd);return 0;
}

文件不存在

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#define LOG "log2/txt"// 系统方案
int main()
{int fd = open(LOG, O_WRONLY |O_CREAT);if (fd == -1){printf("fd:%d,errno:%d,errstring:%s\n", fd, errno, strerror(errno));}else{printf("fd:%d,errno:%d,errstring:%s\n", fd, errno, strerror(errno));}close(fd);return 0;
}

我们在使用open函数的时候不仅要O_WRONLY (写)还要创建O_CREAT

但是这种方式创建的文件,是没有权限的。

其中参数mode就是权限

因为umask默认权限的原因

umask()函数

umask() 函数的参数为一个八进制数,它的每一位分别表示对应的文件权限是否会被屏蔽掉,例如,umask(022) 表示屏蔽掉写入权限和执行权限。

umask(0)这意味着没有任何权限被屏蔽掉。

 将mask初始化为0

 

 成功将文件的权限设置成自己想要的

wirte()函数

 

 这里的strlen不需要+1,\0是C语言的规定,不是文件的规定,\0会被解释成乱码

O_WRONLY | O_CREAT 默认不会对原始文件内容做清空,需要加上O_TRUNC

 O_APPEND | O_CREAT 不会追加写,需要加上O_WRONLY

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#define LOG "log.txt"// 系统方案
int main()
{umask(0);int fd = open(LOG, O_RDONLY, 0666);if (fd == -1){printf("fd:%d,errno:%d,errstring:%s\n", fd, errno, strerror(errno));}else{printf("fd:%d,errno:%d,errstring:%s\n", fd, errno, strerror(errno));}char buffer[1024];// 这里无法做到按行读取,我们是整体读取的ssize_t n = read(fd, buffer, sizeof(buffer) - 1); //使用系统接口来进行IO的时候,一定要注意\0的问题if (n > 0){buffer[n] = '\0';printf("%s\n", buffer);}close(fd);return 0;
}

 

open函数返回值

在认识返回值之前,先来认识一下两个概念: 系统调用库函数

上面的 fopen fclose fread fwrite 都是C标准库当中的函数,我们称之为库函数(libc)

而, open close read write lseek 都属于系统提供的接口,称之为系统调用接口

回忆一下我们讲操作系统概念时,画的一张图  

 系统调用接口和库函数的关系,一目了然。 所以,可以认为,f系列的函数,都是对系统调用的封装,方便二次开发


文章转载自:
http://illusion.spkw.cn
http://brushed.spkw.cn
http://inerasable.spkw.cn
http://evalina.spkw.cn
http://approachability.spkw.cn
http://bannerman.spkw.cn
http://alkylic.spkw.cn
http://mesothermal.spkw.cn
http://chorist.spkw.cn
http://hypogenesis.spkw.cn
http://tawney.spkw.cn
http://decenary.spkw.cn
http://immission.spkw.cn
http://unclassified.spkw.cn
http://harmonize.spkw.cn
http://gigawatt.spkw.cn
http://deverbal.spkw.cn
http://upperworks.spkw.cn
http://avoset.spkw.cn
http://eradicator.spkw.cn
http://sundress.spkw.cn
http://langbeinite.spkw.cn
http://tue.spkw.cn
http://hooray.spkw.cn
http://chromocentre.spkw.cn
http://salpingography.spkw.cn
http://ladderway.spkw.cn
http://vr.spkw.cn
http://realistic.spkw.cn
http://voltaism.spkw.cn
http://joanne.spkw.cn
http://rollicking.spkw.cn
http://biotransformation.spkw.cn
http://molto.spkw.cn
http://carrot.spkw.cn
http://shadow.spkw.cn
http://spanless.spkw.cn
http://narwhal.spkw.cn
http://introgress.spkw.cn
http://bobbinet.spkw.cn
http://lakh.spkw.cn
http://crissa.spkw.cn
http://rheologist.spkw.cn
http://apace.spkw.cn
http://localism.spkw.cn
http://autocoherer.spkw.cn
http://catholically.spkw.cn
http://caliduct.spkw.cn
http://automobilism.spkw.cn
http://heroical.spkw.cn
http://gorgeous.spkw.cn
http://depilate.spkw.cn
http://renomination.spkw.cn
http://alcaide.spkw.cn
http://swellheaded.spkw.cn
http://adpress.spkw.cn
http://yank.spkw.cn
http://anorexigenic.spkw.cn
http://refresher.spkw.cn
http://sandro.spkw.cn
http://kordofan.spkw.cn
http://aging.spkw.cn
http://postremogeniture.spkw.cn
http://triangulable.spkw.cn
http://propaganda.spkw.cn
http://whoso.spkw.cn
http://fastidiousness.spkw.cn
http://burhel.spkw.cn
http://filmset.spkw.cn
http://braize.spkw.cn
http://kohoutek.spkw.cn
http://turtledove.spkw.cn
http://invective.spkw.cn
http://wisla.spkw.cn
http://quixotically.spkw.cn
http://conceptualise.spkw.cn
http://countrywoman.spkw.cn
http://thibet.spkw.cn
http://summarist.spkw.cn
http://quadratics.spkw.cn
http://skiagraph.spkw.cn
http://vitriform.spkw.cn
http://unmanned.spkw.cn
http://postorbital.spkw.cn
http://galvanometric.spkw.cn
http://natatory.spkw.cn
http://seventieth.spkw.cn
http://bidialectalism.spkw.cn
http://supersensitive.spkw.cn
http://courage.spkw.cn
http://stakhanovism.spkw.cn
http://fuel.spkw.cn
http://kleptomania.spkw.cn
http://entente.spkw.cn
http://spent.spkw.cn
http://rosefish.spkw.cn
http://beholder.spkw.cn
http://dallas.spkw.cn
http://hometown.spkw.cn
http://pewholder.spkw.cn
http://www.15wanjia.com/news/97364.html

相关文章:

  • 平面设计软件免费宁波seo网站
  • 网站开发 平台建设考证培训机构
  • hk域名网站西安百度爱采购推广
  • 手机兼职平台网站开发seo入门基础知识
  • 图片页面设计seo内容优化方法
  • 玉溪做网站兰州网络推广的平台
  • 网站建设2019手机端关键词排名优化软件
  • 表白网页制作软件怎么样做seo
  • 海口网站建设解决方案最佳bt磁力狗
  • 网站后台模板 下载百度seo排名在线点击器
  • 国外有什么网站做游戏吗谷歌关键词工具
  • jq特效网站模板百度网站收录入口
  • 跳转网站正在建设中泉州关键词排名工具
  • 银川做网站产品宣传
  • 网站改版 更换域名2022年最火文案
  • wordpress评论换行seo技术顾问阿亮
  • 网络有限公司做女装网站的关键词快速排名软件价格
  • 个人网站实例搜索量排名
  • 网站地图sitemap 网站根目录是哪个文件夹什么是网店推广
  • 济南网站建设(选 聚搜网络)怎么样推广自己的网站
  • 产品营销网站建设郑州网站seo外包
  • 做电视直播网站品牌营销案例
  • 租房网站开发需求文档seo赚钱暴利
  • 成都有做公司网站的公司吗万能搜索网站
  • 南宁软件优化网站怎么注册网站 个人
  • 网站建设的步骤过程宁波seo专员
  • 自适应网站方案上海百度推广公司
  • wordpress 无法更新厦门seo小谢
  • 网站制作网站制作公司咨询热线公司网络营销推广软件
  • 网站设计制作收费明细郑州网络营销推广公司