文件操作
说明:EOF是在头文件 stdio.h中定义的宏。文中出现的函数,全都声明在stdio.h和stdlib.h中。更为详细全面信息,请查看http://en.cppreference.com/w/。
文件缓冲区
ANSI C标准采用缓冲文件系统处理文件,所谓缓冲文件系统是指:系统自动在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区。数据的读写,必须先送入文件缓冲区,装满文件缓冲后才会送入磁盘/程序数据区(程序变量)。
文件指针
缓冲文件系统中,关键概念是“文件指针“。每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息被保存在一个结构体变量中,该结构体类型是系统声明的,取名为FILE,文件指针就是指向**FILE数据类型的,具体说是指向某一文件信息区的开头。不同C编译系统的FILE类包含的内容不完全相同,但大同小异。
打开文件
FILE* open(fileName, mode)
功能:打开指定路径文件
参数:
- filename 文件名称(含绝对路径)
- mode 文件的打开模式,打开模式见表1.1.1
返回值:
- 成功: 指向文件的文件指针
- 失败: 返回NULL ,数据上为0。
示例:FILE* fp = fopen("al.txt", "r");
使用只读模式,打开al.txt文件,并将文件指针赋给文件指针fp。
表1.1.1
文件打开模式 | 含义 | 如果指定文件不存在 |
---|---|---|
r(只读) | 为输入打开一个已存在的本地文件 | 出错 |
w(只写) | 为输出打开一个文本文件 | 建立新文件 |
a(追加) | 向文本文件添加新数据 | 出错 |
rb(只读) | 为输出打开一个二进制文件 | 出错 |
wb(只写) | 为输出打开一个二进制文件 | 建立新文件 |
ab(追加) | 向二进制文件尾添加新数据 | 出错 |
r+(读写) | 为读写打开一个文本文件 | 出错 |
w+(读写) | 为读写建立一个新的文本文件 | 建立新文件 |
a+(读写) | 为读写打开一个文本文件 | 出错 |
rb+(读写) | 为读写打开一个二进制文件 | 出错 |
wb+(读写) | 为读写建立一个新的二进制文件 | 建立新文件 |
ab+(读写) | 为读写打开一个二进制文件 | 出错 |
关闭文件
int fclose(FILE* fp)
功能:关闭fp文件指针指向的文件。
参数:
- fp 指向文件的指针,类型为
FILE*
返回值:
- 成功: 返回0
- 失败: 返回EOF,即-1
示例:fclose(fp);
关闭fp文件指针指向的文件。
文件定位
int feof(FILE* stream)
功能:定位文件指针时否移动到文件末尾
参数:stream 对应的文件指针
返回值:
- 1(真),表示文件指针已经到达末尾。
- 0(假),表示文件指针没有达到末尾。
示例:
while(!feof(stread)) {
...
}
int fseek(FILE *fp, long offset, int fromwhere)
功能:改变文件位置指针的位置。
参数:
- fp 指向文件的指针,类型为
FILE*
- offset 指针以起始点为基准的偏移量,参数类型为
long
,单位为字节。 - fromWhere 指针便宜操作的起始点,用数字表示。0表示文件开始位置,1表示文件当前位置,2表示文件末尾。
返回值:
- 成功: 返回0
- 失败: 返回非0值
示例:
1. fseek(fp, 100L,0);
将位置指针移到文件头100字节处
2. fseek(fp, 50L,1);
将位置指针移到离当前位置后面的50个字节处
3. fseek(fp, -10L,2);
将位置指针从文件末尾处向后退10个字节
long ftell(FILE *stream)
功能:获取文件流(文件光标)当前读写指针位置。
参数:
- stream:已经打开的文件指针
返回值:
- 成功:当前文件流(文件光标)的读写位置
- 失败:-1
示例:
if(i == -1L)printf("error\n")//如果出错,打印error
void rewind(FILE *stream);
功能:把文件流(文件光标)的读写位置移动到文件开头。
参数:
- stream:已经打开的文件指针
返回值:
- 无返回值
示例:
rewind(fp)
文件读写
int fgetc(FILE *stream)
功能:从文件指针stream指向的文件中读取一个字符 ,读取一个字符后,光标位置后移一个字节。
参数:
- stream:已经打开的文件指针
返回值:
- 从指定文件读取到的一个字符。
- 读取出错时或文件末尾时,返回EOF并设置文件错误标志位;ferror(stream) 函数可检测此错误。
示例:
while(!feof(stream)) {
ch = fgetc(stream);
}
int fputc (int c, FILE *fp)。
功能: 将字符c写到文件指针fp所指向的文件的当前写指针的位置。
参数:
- c :需要写入文件的字符。
- fp:已经打开的文件指针。
返回值:
- 在正常调用情况下,函数返回写入文件的字符的ASCII码值,操作成功后,文件内部写指针会自动后移一个字节。
- 出错时,返回EOF(-1)。
示例:
char ch = fputc(c, fp);
char *fgets(char *buf, int n, FILE *stream);
功能: 从stream指向的文件读入一个长度为(n-1)的字符串,存在在buf字符数组中。
参数:
- buf:读取的字符存放的字符数组指针。
- n:从sream指向的文件中读入n-1个字符,并且在末尾加一个’\0’。
- stream: 文件的字符指针。
说明:如果在读完n-1个字符之前遇到换行符“\n”或文件结束符EOF,读入结束,但将所遇到的换行符“\n”也作为一个字符读入。
返回值:
- 成功:返回buf数组首元素地址。
- 失败:如果一开始就遇到文件尾货读数据出错,返回NULL。
示例:
while(fgets(str, 10, fp) != NULL) {
...
}
int fputs(const char *str, FILE *stream);
功能: 把字符串输出到stream指向的文件中。
参数:
- str:字符串,该值可以使字符串常量、字符数组名或字符型指针。字符串末尾的“\0”不输出
- stream: 文件的字符指针。
返回值:
- 成功:返回值为0。
- 失败:返回值为EOF。
示例:
fputs(str,fp)
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream);
功能: 从二进制模式打开的文件中读取指定大小的数据块。
参数:
- buffer:读入数据的存放地址。
- size:要读写的字节数。
- count:要读写多少个size大小的数据。
- stream:文件型指针
文件以二进制形式打开,使用fread和fwrite可以读写任何类型的信息。
返回值:
- 成功:返回读或写的记录数,该记录数等于count。
- 失败:出错或读到文件末尾时返回的记录数小于count,也可能返回0。
示例:
struct student_type {//定义结构体
char name[10];
int num;
int age;
char addr[30];
} stud[40];
for(i = 0; i< 40; i++)
fread(&stud[i], sizeof(student_type), 1, fp);//假设fp中shi
int fwrite(const void *ptr, int size, int count, FILE *stream);
功能: 从二进制模式打开的文件中读取指定大小的数据块。
参数:
- ptr:要输入数据的地址。
- size:要读写的字节数。
- count:要读写多少个size大小的数据。
- stream:文件型指针
文件以二进制形式打开,使用fread和fwrite可以读写任何类型的信息。
返回值:
- 成功:返回读或写的记录数,该记录数等于count。
- 失败:出错或读到文件末尾时返回的记录数小于count,也可能返回0。
示例:
struct student_type {//定义结构体
char name[10];
int num;
int age;
char addr[30];
} stud[40];
for(i = 0; i< 40; i++)
fwrite(&stud[i], sizeof(struct student_type), 1, fp);
int fwrite(const void *ptr, int size, int count, FILE *stream);
功能: 从二进制模式打开的文件中读取指定大小的数据块。
参数:
- ptr:要输入数据的地址。
- size:要读写的字节数。
- count:要读写多少个size大小的数据。
- stream:文件型指针
文件以二进制形式打开,使用fread和fwrite可以读写任何类型的信息。
返回值:
- 成功:返回读或写的记录数,该记录数等于count。
- 失败:出错或读到文件末尾时返回的记录数小于count,也可能返回0。
示例:
struct student_type {//定义结构体
char name[10];
int num;
int age;
char addr[30];
} stud[40];
for(i = 0; i< 40; i++)
fwrite(&stud[i], sizeof(struct student_type), 1, fp);
int fscanf(FILE * stream, const char * format, ...);
功能: 从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。
参数:
- stream:文件型指针
- format:字符串格式,用法和printf()一样
- …:输入列表
文件以二进制形式打开,使用fread和fwrite可以读写任何类型的信息。
返回值:
- 成功:参数数目,成功转换的值的个数。
- 失败:- 1。
示例:
//如果fp上有字符:3 4.5 1。fscanf读取数据3送给变量a,4.5送给变量b,1送给变量c。
fscanf(fp, "%d %d %d\n", &a, &b, &c);
int fprintf(FILE * stream, const char * format, ...);
功能: 根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 ‘\0’ 为止。
参数:
- stream:文件型指针
- format:字符串格式,用法和printf()一样
- …:输入列表
文件以二进制形式打开,使用fread和fwrite可以读写任何类型的信息。
返回值:
- 成功:参数数目,成功写入值的个数。
- 失败:- 1。
示例:
fprintf(fp, "%d %d %d\n", 1, 2, 3);