目录
1、缓冲的概念和条件。
(1)、行缓冲:
标准的io库函数往标准输出端输出东西(例如屏幕)。所谓行缓冲就是缓冲区碰到换行符的时候才能刷新缓冲区,如果不刷新缓冲区,无法对文件执行读写操作。
(1)、刷新条件:1、遇到换行符就可以刷新。
2、程序正常结束。
3、fflush(stdout)刷新函数标准输出。
4、当缓冲区满之后自动刷新(默认1024个字节)。
(2)、全缓冲:
标准的io库函数往普通文件读写数据。碰到换行符不刷新,缓冲区满了才刷新。
(1)、刷新条件:1、缓冲区满了。
2、fflush(stdout)文件指针。
3、程序正常结束。
2、文件的基本操作和文件的流程。
(1)、文件的概念:
文件在c中被看成一系列连续的字节,每个字节都能被单独读取。c提供俩种文件模式:文本模式和二进制模式,与linux中的文件结构相对应。文本文件:二进制编码的字符。二进制文件:二进制值例如图片和音乐。下面以写入图片文件红色为例的代码:
(2)、文件指针和写文件的流程:
文件指针:标识一个文件,所有对文件的操作。 FILE *文件名(类似于结构体指针)。
写文件流程:应用程序->内核空间->驱动程序->硬盘。应用程序和内核空间不在同一空间,设置缓冲区的目的是为了减少进入内核的次数,提高程序的效率。
(3)、对文件的操作:
打开文件打开文件指针,对文件读写等操作,最后关闭文件,关闭之后不能进行操作。
(4)、自带文件:
c中有三个文件可以不用文件指针,直接使用。标准输入stdin 标准输出stdout 标准错误输出stderr。
3、fopen函数的定义和使用。
fopen()函数打开文件,该函数声明在stdio.h中,第一个参数是待打开的文件名,更准确的说是文件名的字符串地址,第二个参数是字符串,待打开文件的模式。
代码格式:FILE *fopen(const char *path,const char *mode)。
fopen:打开文件并返回指针,创建文件并返回指针。
path:绝对路径或者相对路径。
mode:字符串
"r"/"rb" | 只读方式打开文件,不创建文件。 |
"w"/"wb" | 写方式打开文件,并且清空,没有这个文件就会创建文件。 |
"a"/"ab" | 以添加方式打开文件,跳转到在末尾处,当文件不存在时相当于写操作。 |
"r+"/"rb+" | 以可读可写方式打开文件,不创建文件。 |
"w+"wb+" | 以可读可写方式打开文件,创建文件。 |
"a+"/"ab+" | 以可读写模式进入文件,并且文件存在的情况下在末尾添加文件,不存在则创建文件。 |
4、fclose函数的定义和使用。
关闭文件。定义:int fclose (FILE *fp)关闭fp文件,一个文件只能被关闭一次,不能多次关闭,关闭之后不能进行读写操作,成功返回0,失败返回非0。
5、fgetc函数定义和使用。
格式:int fgetc(FILE *stream)
从文件中一个字节并返回。
返回值:以t方式(文本文件方式)读取到文件结尾返回EOF。
以b方式(二进制文件方式)读取到文件末尾返回feof。
6、fputc函数的定义和使用。
向文件中写入一个字符
格式:fputc('c',fp)
7、fgets函数的定义和使用。
格式:char *fgetc(char *s,int size,FILE *stream)
从文件中读取内容,保存到s里面,size表示每次读取的最大个数,stream表示文件指针。
返回值:成功读取数据地址,失败返回NULL,如果文件读取完毕返回NULL。
注意:从文件指针中读取字符的时候,读取中碰到换行符或者文件末尾停止读取,或者读取到
size-1个字节的时候停止读取,读取的最后一个内容加上\0。
8、fputs函数的定义和使用。
格式:int fputs(const char *s,FILE *stream)将s中的字符串写入到stream所代表的文件指针文件。
返回值:成功返回字节数,失败返回-1。
9、fread函数的定义和使用。
格式:size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
从stream中读取的有nmemb块文件,每个块是size个字节,保存在ptr中。
返回值:块数,例如读取到下图代码就是4块。
10、fwrite函数的定义和使用。
写文件。格式:size_t fwrite (void *ptr,size_t size,size_t nmemb,FILE *stream)
将ptr中的数据写入stream文件中,块数是nmemb块,一个块有size个字节。
一般进入写文件会在文件末尾处,加上rewind(文件指针)设置偏移量到文件的首部。
11、fprintf和fscanf函数的定义和使用。
fprintf函数:函数将数据输出到文件指针所指定的文件。
fscanf函数:从文件指针所标识的文件中获取输入。
12、随机读取函数的使用。
rewind 函数:复位 。rewind(文件指针)
fseek函数:定位任意位置。int fseek(FILE *stream,long offset,int whence)
文件指针 位移量 起始点
ftell函数:测文件读写位置距文件多少字节。int length = ftell(fp)
起始位置 | |
文件开头 | SEEK_SET |
文件当前位置 | SEEK_CUR |
文件末尾 | SEEK_END |
位移量以起始点为基点,正向移动到末尾是正数,向开头移动是负数。
13、make的定义和使用。
1、make的定义
(1)、make是个命令用来解析makefile文件,一般存放在/usr/bin。
(2)、make解决的主要问题简化编译程序时候的命令,提高效率。
(3)、在大型项目中,使用make可以判断那些文件进行修改了,只会重新编译修改的文件。
2、make的用法
(1)、make 使用自带的makefile文件,一般默认在当前文件下寻找GUNmakefile,makefile,Makefile文件作为输入文件。
(2)、自定义的makefile文件一般 make -f 文件名。
14、makefile的定义和使用。
1、makefile的定义
语法规则: 目标 依赖文件列表
<Tab> 命令列表
(1)、目标:要产生的文件名,目标可以是可执行文件或者其他obj文件,也可以是动作的名称。
(2)、依赖文件:用来输入从而产生目标文件(可以有多个或者没有)。
(3)、命令:make执行的动作,可以多个或者没有,又多个的情况,一行只写一个动作。
2、makefile的使用
(1)、main代表目标文件,main.o sub.o sum.o代表依赖文件。下面的是命令列表。
(2)、main.0代表目标文件,main.c代表依赖文件。下面是命令列表。
(3)、clean代表目标文件,下面是命令列表。
一般makefile执行从第二个main.o开始执行,将这些.c文件编译成.o文件,然后执行第一步编译成main可执行文件。使用make clean会执行删除所有的.o文件,main文件,a.out文件。
3、交叉编译时makefile的使用
可以将前面的五行看作为宏定义的作用。分别替代掉之前的写法。
其中💲 符号相当于是自定义的类型例如gcc在开头重命名之后,下面格式应该是💲(cc)。
这样做的目的在交叉编译的时候可移植性更高,一般一直到芯片上的时候都是在linux中生成可执行文件再移植。