文件
注:本文为学习《C语言从入门到精通》时,对部分章节的总结
1、文件概述
文件:一组相关数据的有序集合。
所有文件都可以通过流进行输入、输出操作。与文本流和二进制流相对应,文件可以分为文本文件和二进制文件。
- 文本文件,也称为ASCⅡ文件。这种文件在保存时,每个字符对应一个字节,用于存放对应的ASCⅡ码
- 二进制文件,按二进制编码方式保存文件内容
文件可以从不同角度进行具体分类:
- 从用户角度(或所依附的介质)看,文件可分为普通文件和设备文件
- 普通文件:驻留在磁盘或其他外部介质上的一个有序数据集
- 设备文件:与主机相连的各种外部设备,把它们的输入、输出等同于对磁盘文件的读和写
b、按文件内容看,可以分为源文件、目标文件、可执行文件、头文件和数据文件
2、文件基本操作
文件的基本操作包括文件的打开和关闭。
2.1、文件指针
文件指针:一个指向文件有关信息的指针,这些信息包括文件名、状态和当前位置,它们保存在一个结构体中,C语言规定该类型为FILE型
typedef struct {
short level;
unsigned flags;
char fd;
unsigned char hold;
short bsize;
unsigned char *buffer;
unsigned ar *curp;
unsigned istemp;
short token;
} FILE;
2.2、文件的打开
fopen函数用来打开一个文件,打开文件的操作就是创建一个流。fopen函数的原型在stdio.h中。
FILE *fp;
fp = fopen(文件名,使用文件方式);
文件名:将要被打开文件的文件名
使用文件方式:
文件使用方式 | 含义 |
r(只读) | 打开一个文本文件(要求存在),只允许读数据 |
w(只写) | 打开(先清空)或建立一个文本文件,只允许写数据 |
a(追加) | 打开一个文本文件,并在文件末尾写数据 |
rb(只读) | 打开一个二进制文件),只允许读数据 |
wb(只写) | 打开(先清空)或建立一个二进制文件,只允许写数据 |
ab(追加) | 打开一个二进制文件,并在文件末尾写数据 |
r+(读写) | 打开一个文本文件,允许读和写 |
w+(读写) | 打开(先清空)或建立一个文本文件,允许读和写 |
a+(读写) | 打开一个文本文件,允许读或在文件末追加数据 |
rb+(读写) | 打开一个二进制文件,允许读和写 |
wb+(读写) | 打开(先清空)或建立一个二进制文件,允许读和写 |
ab+(读写) | 打开一个二进制文件,允许读或在文件末追加数据 |
使用fopen函数打开文件成功,返回一个有确定指向的FILE类型指针;若打开失败,返回NULL。通常打开失败原因:
- 指定的盘符或路径不存在
- 文件名中含有无效字符
- 以r模式打开一个不存在的文件
2.3、文件的关闭
文件使用完毕后,使用fclose函数关闭。
fclose(文件指针);
正常关闭文件操作时,fclose函数返回0,否则返回EOF。
程序结束之前应关闭所有文件,可以防止因为没有关闭文件而造成的数据流失。
3、文件的读写
3.1、fputc函数
int ch = fputc(int ch, FILE *fp);
该函数的作用是把一个字符写到磁盘文件中去。该文件必须以读或读写的方式打开。当函数遇到文件结束符,返回一个文件结束标志EOF。
3.2、fgetc函数
ch = fgetc(fp);
int fgetc(FILE *stream);
该函数的作用是把从指定的文件读入一个字符赋给ch。其中,ch是要输出的字符,fp是文件指针,函数输出成功,返回值就是输出的字符,失败,则返回EOF。
3.3、fputs函数
fputs(字符串, 文件指针);
int fputs(const char *str, FILE *stream);
该函数的作用是向指定的文件写入一个字符串。
3.4、fgets函数
fgets(字符数组名, n, 文件指针);
char *fgets(char *str, int n, FILE *stream);
该函数的作用是从指定的文件中读一个字符串到字符数组中。n表示所得到的字符串中字符的个数(包含“\0”)。
3.5、fprintf函数
ch = fprintf(文件类型指针, 格式字符串, 输出列表);
int fprintf(FILE *stream, const char *format, ...)
比如:fprintf(fp, “%d”, i);
该函数的作用是将变量i的值以“%d”的格式输出到fp指向的文件中。
如果成功,则返回写入的字符总数,否则返回一个负数。
3.6、fscanf函数
fscanf(文件类型指针, 格式字符串, 输入列表);
int fscanf(FILE *stream, const char *format, ...)
比如:fscanf(fp, “%d”, &i);
该函数的作用是读入fp所指向的文件中的i的值。
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
3.7、fread和fwrite函数
fread(buffer, size, count, fp);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
该函数的作用是从fp所指向的文件中读入count次,每次读size字节,读入的信息存在buffer地址中。
fwrite(buffer, size, count, fp);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
该函数的作用是将buffer地址开始的信息输出count次,每次写size字节到fp指向的文件中。+0.
4、文件的定位
4.1、fseek函数
fseek(文件指针, 位移量, 起始点);
int fseek(FILE *stream, long int offset, int whence)
该函数作用:移动文件内部的位置指针。
- 文件指针:指向被移动的文件
- 位移量:表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB时不会出错。当用常量表示位移量时,要求加后缀“L”
- 起始点:表示从何处开始计算位移量,规定的起始点有文件首、文件当前位置和文件尾3种
起始点 | 表示符号 | 数字表示 |
文件首 | SEEK-SET | 0 |
文件当前位置 | SEEK-CUR | 1 |
文件尾 | SEEK-END | 2 |
fseek(fp, -20L, 1); // 表示将位置指针从当前位置向后退20字节。
fseek函数一般用于二进制文件。在文本文件中由于要进行转换,往往计算的位置会出现错误。
4.2、rewind函数
void rewind(文件指针);
该函数的作用:使位置指针重新返回文件的开头,该函数没有返回值
4.3、ftell函数
long ftell(文件指针);
该函数作用:得到流式文件中的当前位置,用相对于文件开头的位移量来表示,当函数出错时,返回-1L。