一、打开文件
打开文件使用库函数中的fopen函数。fopen函数会为要打开的文件新建一个流,然后返回一个指向file型对象的指针,该file型对象中保存了控制这个流所需要的信息。
fp=fopen("1.txt","r")
这里fp可以任意命名,fp不是流的实体,而是指向流的指针。接收两个参数,一个是文件名,另一个是打开文件的模式。
打开文件的mode模式有:
Mode | 描述 |
r | 以只读模式打开文件 |
w | 以只写模式打开文件,若文件存在则文件长度清0 |
a | 以追加模式(从文件末尾处开始的只写模式)打开或建立文本文件 |
rb | 以只读模式打开二进制文件 |
wb | 以只写模式打开二进制文件,若文件存在则文件长度清0 |
ab | 以追加模式(从文件末尾处开始的只写模式)打开或建立二级制文件 |
r+ | 以读写模式打开文件 |
w+ | 以读写模式打开文件,若文件存在则文件长度清0 |
a+ | 以追加模式(文件末尾处开始写入的更新模式)打开或建立文本文件 |
r+b或rb+ | 以读写模式打开二进制文件 |
w+b或wb+ | 以读写模式建立二进制文件,若文件存在则文件长度清0 |
a+b或ab+ | 以追加模式(文件末尾处开始写入的更新模式)打开或建立二进制文件 |
以读取模式(mode以字符'r开头')打开文件时,如果该文件不存在或者没有读取权限,则文件打开失败。
对于追加模式(mode以字符'a'开头)打开的文件,打开后的写入操作都是从文件末尾处开始的。
对于以读写模式(mode的第2或第3个字符为'+')打开的文件相关联的流,可以进行输入和输出操作。但若要在输出操作之后进行输入操作,就必须在这两个操作之间调用文件定位函数(fseek、fsetpos或rewind)。
返回一个指向对象的指针,该对象用于控制打开的流。打开操作失败时,返回空指针。
二、关闭文件
当文件操作完毕后一定要关闭文件,目的是刷新stream流,将保存在缓存中的内容写入到文件中。
fclose(fp)
若成功的关闭流,则返回0,否则返回EOF。
完整的打开关闭文件例子:
从键盘读入文件名,并打开:
三、文件数据汇总
要从文件中读取数据需要用fscanf函数。fscanf可以对任意流执行与scanf函数相同的输入操作,比scanf多一个参数。
fscanf(fp,"%d",&x)
函数将取到的数据保存在参数x中,若没有执行任何转换就发生了输入错误,则返回定义的EOF错误,否则返回成功赋值的输入项数。若在输入中发生匹配错误,则返回的输入项会少于转换说明符对应的实参个数,甚至为0。
练习:从指定文件读入数据,对其中的身高进行从高到低排序:
test.txt文件内容:
源代码:
四、向文件写入数据
printf函数是向标准输出流进行输出的函数,而向任意流执行同样操作就是fprintf函数。
fprintf(fp,"%d",x)
练习1:写入日期和时间
将当前日期和时间写入指定文件
练习2:从键盘读取名字、身高和体重信息,并写入文件
五、文件内容的显示与复制
将A文件的内容读取后写入到B文件中。fgetc()函数:读文件函数(由文件中读取一个字符)
练习1:复制A文件内容到B文件
练习2:显示文件内容
练习3:统计读入文件的文件行数
注:对最后一行处理时需要注意,最后一行如果为换行符则不需要操作,如果不为换行符则需要对count再加一行!
六、在二进制文件中保存实数
fwrite和fread函数分别用于二进制文件的写入与读取。
文件写入函数为:
fwrite(&pi,sizeof(double),1,fp)
文件读取函数为:
fread(&pi,sizeof(double),1,fp)