一、文件的读写操作
文件的读写操作依靠某些函数实现,以下会介绍三组函数
第一组:
fgetc()字符输入函数
fputc()字符输出函数
第二组:
fgets()文本行输入函数
fputs()文本行输出函数
第三组:
fscanf()格式化输入函数
fprintf()格式化输出函数
第一组:
fputc()函数
#include<stdio.h>
int fputc(int character,FILE*stream)
功能:写入字符在文件中
参数:字符的ASCII码 文件指针
举个例子:将字符a写入一个data.txt 的文本文件里
运行代码:
因为只执行写的操作,所以文件打开方式设置为“w”
运行程序后,可以去看看该test.c所在目录下的data.txt文件,字符a已经写入:
fgetc()函数
#include<stdio.h>
int fgetc(FILE*stream)
功能:按顺序读取文本的每一个字符,返回其ASCII码值,读取失败,返回EOF
参数:文件指针
举个例子:读取data.txt文本文件中的内容并拷贝,输出到屏幕(类似复制粘贴)
这里我们事先在test.c所在目录中创建一个data.txt文件,里面写有内容:abcdefg
如图:
运行代码:
因为只执行读的操作,所以文件打开方式设置位"r"
运行结果:
奇怪,为什么打印出来的不是abcdef?而是bdf,这里我们就需要深入了解文件读写函数运行的实质——光标移动。
每一次光标移动,fgetc()函数会返回一个ASCII码值。
回头看看上面的情况,我们发现,经过每一轮循环,我们用了2次fgetc()函数(循环判断条件语句和循环内语句各占一次),所以光标在每次循环中移动2位,但是每轮循环只执行1次打印。
因此,只打印了3个字符。
这里是修改版本:
第二组:
fputs()函数
#include<stdio.h>
int fputs(const char*str,FILE*stream)
功能:将字符串写入文件中
参数:字符串地址 文件指针
同样的,我们事先在test.c文件所在目录中创建一个data.txt的空文本文件:
如图:
运行代码:
因为只执行写的操作,所以文件打开方式设置位“w”
运行结果:
fgets()函数
#include<stdio.h>
char*fgets(char*str,int num,FILE*stream)
功能:从流中读取数据,读取的数据放入str指向的这块空间中,最多读取num个
参数:要放入数据的空间 最多读取的字符数(包括'\0'结束标志) 文件指针
注意:
假设你要读取‘abc’这个字符串并且放入字符数组arr ch[20]中,那么这个参数int 要输入4,而不是3,因为字符串‘abc’其实包含结束标志'\0',这个结束标志也算被读取的字符
举例:读取data.txt文件里面的“abc”存入字符数组ch中,打印ch的内容
首先,在test.c文件所在的目录下创建一个data.txt 文件,文件内容为“abc”
运行代码:
因为只进行读操作,所以打开方式选择“r”
运行结果:
第三组:
fprintf()函数
#include<stdio.h>
int fprintf(FILE*stream,const char*format,...)
功能:将列表中的数据写入文件中
参数:文件指针 格式 可变参数列表
和恢复
这个函数乍一看名字与printf()函数十分相似,如果不细心看还有可能弄混,如果去研究二者的形式参数,你就会发现,他们的参数也是十分像的,因此,只要你会使用printf()函数,这个函数也是可以轻松掌握的。
那就来对比看看二者的参数:
参数对比
int printf(const char* format,...)
int fprintf(FILE*stream,const char*format,...)
二者只差了一个FILE*stream
printf()函数的功能是将变量的内容打印到屏幕上,而fprintf()函数的功能是将变量的内容打印到指定文件中,当然,fprintf()函数也可以将变量的内容打印到屏幕上,下面会介绍。
例子:将源代码里面的变量的信息写入文件中
首先,在test.c文件所在目录下创建一个data.txt文本文件,文件内容为空:
运行代码:
因为只执行写的操作,所以文件打开方式选择”w”
运行结果:
可以看到,源代码里面的变量字符数组ch和整型a的内容都被写入文件中。与fputc()函数和fputs()函数不同的是,前者写入文件的内容是变量的内容,而后者写入的内容不是变量的内容。
利用fprintf()函数将变量的内容打印到屏幕中:
这里要使用到前面文章C语言:文件操作(一)里介绍的标准输出流stdout。
只要将fprintf()函数的文件指针的参数传入stdout就行,因为在文章里就说过,三种标准流其实就是文件指针类型的变量。
fscanf()函数
#include<stdio.h>
int fscanf(FILE*stream,const char*format,...)
功能:读取数据,放到指定的内存空间中
参数:文件指针 格式 可变参数列表
这个函数与scanf()函数也是十分相似,因此我们来对比一下二者:
参数对比:
int scanf(const char*format,...)
int fscanf(FILE*stream,const char*format,...)
二者只差了一个FILE*stream
scanf()函数的作用是按照格式读取键盘上输入的数据,并赋值给指定的变量,而fscanf()函数的作用就是按照格式读取指定文件的内容,并赋值给指定的变量。
举例:读取文件内容,并赋值给指定变量
首先,在test.c文件所在目录下有一个data.txt文本文件,它是我们上一个函数的产物。
运行代码:
打开方式选择“r"
运行结果: