目录
一、文件操作
1.什么是文件
磁盘上的文件是文件 。
一般文件分为两类:程序文件、数据文件(文件功能分)
1.1程序文件
源文件(后缀.c)、目标文件(windows环境 后缀 .obj)、可执行程序(windows环境 后缀.exe)
1.2数据文件
文件内容不一定是程序,而是程序运行时读写的数据
1.3文件名
文件名包含3部分:文件路径+文件名主干+文件后缀
例如:c:\user\code\test.c
文件标识常被称文件名
2.文件的打开和关闭
2.1文件指针
信息保存在一个结构体变量中,该结构体变量系统声明的,为FILE
不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
2.2文件的打开和关闭
FILE *fopen(char *filename, char *mode);//文件打开
int *fclose(FILE *stream);//文件关闭
打开方式 | 说明 |
---|---|
r | 以只读方式打开文件,只允许读取,不允许写入。该文件必须存在。 |
r+ | 以读/写方式打开文件,允许读取和写入。该文件必须存在。 |
rb+ | 以读/写方式打开一个二进制文件,允许读/写数据。 |
rt+ | 以读/写方式打开一个文本文件,允许读和写。 |
w | 以只写方式打开文件,若文件存在则长度清为0,即该文件内容消失,若不存在则创建该文件。 |
w+ | 以读/写方式打开文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 |
a | 以追加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留)。 |
a+ | 以追加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符 不保留)。 |
wb | 以只写方式打开或新建一个二进制文件,只允许写数据。 |
wb+ | 以读/写方式打开或建立一个二进制文件,允许读和写。 |
wt+ | 以读/写方式打开或建立一个文本文件,允许读写。 |
at+ | 以读/写方式打开一个文本文件,允许读或在文本末追加数据。 |
ab+ | 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。 |
3.文件顺序读写
函数名 | 适用于 | 功能 |
fgetc | 所有输入流 | 字符输入函数 |
fputc | 所有输出流 | 字符输出函数 |
fgets | 所有输入流 | 文本行输入函数 |
fputs | 所有输出流 | 文本行输出函数 |
fscanf | 所有输入流 | 格式化输入函数 |
fprintf | 所有输出流 | 格式化输出函数 |
fread | 文件 | 二进制输入 |
fwrite | 文件 | 二进制输出 |
fgetc函数声明:int fgetc( FILE * fp );
fputc函数声明:int fputc( int c, FILE *fp );
fgets函数声明:char *fgets( char *buf, int n, FILE *fp );
fputs函数声明:int fputs( const char *s, FILE *fp );
fscanf函数声明:int fscanf(FILE *stream, const char *format, ...);
fprintf函数声明:int fprintf(FILE *stream, const char *format, ...);
4.函数对比
这里我们举出来的函数是fread和fwrite
实则每两对函数都是大体相仿的
scanf 是针对标准输入的格式化输入语句
printf 是针对标准输入的格式化输出语句
fscanf 是针对所有输入流的格式化输入语句
fprintf 是针对所有输出流的格式化输出语句
sscanf 把一个格式化的数据写到字符串中
sprintf 把字符串转化成一个格式化数据
5.文件的随机读写
5.1fseek
可以随机将文件指针放到想要的位置
int fseek (FILE * stream, long int offset , int origin );
使用例:
#include<stdio.h>
int main()
{
FILE* pFile;
pFile = fopen("example.txt", "wb");
fputs("This is an apple.", pFile);
fseek(pFile, 8, SEEK_SET);
fputs(" sam", pFile);
fclose(pFile);
return 0;
}
运行结果:
fseek还有其他的指向位置
指向 | |
SEEK_SET | 文件的起始位置 |
SEEK_CUR | 文件当前指向的位置 |
SEEK_END | 文件末尾的位置 |
5.2ftell
用于计算文件指针的偏移量
#include<stdio.h>
int main()
{
FILE* pf;
pf = fopen("contact.txt", "wb");
fputs("abcdef", pf);
fclose(pf);
pf = NULL;
pf = fopen("contact.txt", "rb");
fseek(pf, 2, SEEK_SET);
int ch = fgetc(pf);
printf("%c\n", ch);
printf("%d\n", ftell(pf));//3
fseek(pf, -1, SEEK_END);
ch = fgetc(pf);
printf("%c\n", ch);
printf("%d\n", ftell(pf));//6
//fseek(pFile, 8, SEEK_SET);
//fputs(" sam", pFile);
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
5.3rewind
函数解释:将文件指针置回开头(用于文件指针找不到,或者想要文件从头开始)
#include<stdio.h>
int main()
{
FILE* pf;
pf = fopen("contact.txt", "wb");
fputs("abcdef", pf);
fclose(pf);
pf = NULL;
pf = fopen("contact.txt", "rb");
fseek(pf, 2, SEEK_SET);
int ch = fgetc(pf);
printf("%c\n", ch);
printf("%d\n", ftell(pf));//2
fseek(pf, -1, SEEK_END);
ch = fgetc(pf);
printf("%c\n", ch);
printf("%d\n", ftell(pf));//16
//fseek(pFile, 8, SEEK_SET);
//fputs(" sam", pFile);
rewind(pf);
ch = fgetc(pf);
printf("%c\n", ch);//a 返回到了开始的a
fclose(pf);
pf = NULL;
return 0;
}
运行结果:
6. 文本文件和二进制文件
文本文件:是以ASCll形式存储的
二进制文件:是以二进制的形式存储的
使用例:
#include<stdio.h>
int main()
{
int a = 52013;
FILE* pf = fopen("test.txt", "wb");
fwrite(&a, 4, 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
二进制文件存储:运行结果
7.文件读取结束的判定
7.1feof使用
应用于当文件读取结束的时候,判断式读取失败结束,还是遇到文件尾结束
文本文件读取是否结束,判断返回值是否为EOF(fgetc),或者NULL(fgets)
feof判断:文件读取为NULL停止
ferror判断:文件读取错误停止
8.文件缓冲区
ANSIC标准采用“缓冲文件系统”处理的数据文件,内存数据向磁盘输出数据会先送到内存中的缓冲区