C语言文件类型
定义
- 在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可
对它所指的文件进行各种操作
FILE * 指针变量标识符;
例如:FILE *fp;
文件的打开与关闭
fopen 函数
- 用来打开一个文件,其调用的一般形式为:
文件指针名=fopen(文件名,使用文件方式);
| 文件使用方式 | 意义 |
|---|---|
| “r” | 只读的方式打开一个文本文件,只允许读数据 |
| “w” | 只写的方式打开或建立一个文本文件,只允许写数据 |
| “a” | 追加的方式打开一个文本文件,并在文件末尾写数据 |
| “rb” | 只读的方式打开一个二进制文件,只允许读数据 |
| “wb” | 只写的方式打开或建立一个二进制文件,只允许写数据 |
| “ab” | 追加的方式打开一个二进制文件,并在文件末尾写数据 |
| “r+” | 读写的方式打开一个文本文件,允许读和写 |
| “w+” | 读写的方式打开或建立一个文本文件,允许读写 |
| “a+” | 读写的方式打开一个文本文件,允许读,或在文件末追加数据 |
| “rb+” | 读写的方式打开一个二进制文件,允许读和写 |
| “wb+” | 读写的方式打开或建立一个二进制文件,允许读和写 |
| “ab+” | 读写的方式打开一个二进制文件,允许读,或在文件末追加数据 |
fclose 函数
- 文件一旦使用完毕,应用关闭文件函数把文件关闭,以避免文件的数据丢失等错误。
调用的一般形式是:
fclose(文件指针);
close(*fp);文件的读写
对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数:
- 字符串读写函数:fgets 和 fputs
- 数据块读写函数:freed 和 fwrite
- 格式化读写函数:fscanf 和 fprinf
下面分别予以介绍。使用以上函数都要求包含头文件 stdio.h。
读字符函数 fgetc
fgetc 函数的功能是从指定的文件中读一个字符,函数调用的形式为:
字符变量=fgetc(文件指针);
写字符函数 fputc
fputc 函数的功能是把一个字符写入指定的文件中,函数调用的形式为:
fputc(字符量,文件指针);
读字符串函数 fgets
函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:
fgets(字符数组名,n,文件指针);
其中的 n 是一个正整数。表示从文件中读出的字符串不超过 n-1 个字符。在读入的最
后一个字符后加上串结束标志’\0’。
写字符串函数 fputs
fputs 函数的功能是向指定的文件写入一个字符串,其调用形式为:
fputs(字符串,文件指针);
其中字符串可以是字符串常量,也可以是字符数组名,或指针变量,
数据块读写函数fread 和fwtrite
C语言还提供了用于整块数据的读写函数。可用来读写一组数据,如一个数组元素,一
个结构变量的值等。
读数据块函数调用的一般形式为:
fread(buffer,size,count,fp);写数据块函数调用的一般形式为:
fwrite(buffer,size,count,fp);其中:
- buffer 是一个指针,在 fread 函数中,它表示存放输入数据的首地址。在 fwrite 函数中,它表示存放输出数据的首地址。
- size 表示数据块的字节数。
- count 表示要读写的数据块块数。
- fp 表示文件指针。
格式化读写函数fscanf 和fprintf
fscanf 函数,fprintf 函数与前面使用的 scanf 和 printf 函数的功能相似,都是格式化读写函数。两者的区别在于 fscanf 函数和 fprintf 函数的读写对象不是键盘和显示器,而是磁盘文件。
这两个函数的调用格式为:
例如:fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列);fscanf(fp,"%d%s",&i,s); fprintf(fp,"%d%c",j,ch);
文件定位
移动文件内部位置指针的函数主要有两个,即 rewind 函数和 fseek 函数。
rewind 函数
它的功能是把文件内部的位置指针移到文件首,其调用形式为:
rewind(文件指针);
fseek 函数
用来移动文件内部位置指针,其调用形式为:
fseek(文件指针,位移量,起始点);
其中:
- “文件指针”指向被移动的文件。
- “位移量”表示移动的字节数,要求位移量是 long 型数据,以便在文件长度大于 64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。
- “起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。
其表示方法如下表:
| 起始点 | 符号表示 | 数字表示 |
|---|---|---|
| 文件首 | SEEK_SET | 0 |
| 当前位置 | SEEK_CUR | 1 |
| 文件末尾 | SEEK_END | 2 |
文件的随机读写
在移动位置指针之后,即可用前面介绍的任一种读写函数进行读写。由于一般是读写一
个数据据块,因此常用 fread 和 fwrite 函数。
文件检测函数
文件结束检测函数:feof
调用格式:
feof(文件指针);
功能:判断文件是否处于文件结束位置,如文件结束,则返回值为 1,否则为 0。
读写文件出错检测函数:ferror
函数调用格式:
ferror(文件指针);
功能:检查文件在用各种输入输出函数进行读写时是否出错。如 ferror 返回值为 0 表示未出错,否则表示有错。
文件出错标志和文件结束标志置 0 函数:clearerr
函数调用格式:
clearerr(文件指针);
功能:本函数用于清除出错标志和文件结束标志,使它们为 0 值。
附录:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Size 10
/*********二进制方式向文件读写一组数据***********
* fread(buffer,size,count,fp);
* fwrite(buffer,size,count,fp);
buffer:是一个地址,存放从文件读入的数据的存储区的地址
size: 读写的字节数(读出数据类型的空间)
count: 读写的数据量
fp: 指向文件的指针
*************************************************/
struct students
{
char name[5];
int age;
int number;
}stu[Size];
void main ()
{
FILE *fp;
int i;
printf("please input 10 student's data:\n");
for(i=0;i<Size;i++)
scanf("%s %d %d",stu[i].name,&stu[i].age,&stu[i].number);
if((fp=fopen("student data.txt","wb"))==NULL)
exit(0);
for(i=0;i<Size;i++)
{
if(fwrite(&stu[i],sizeof(struct students),1,fp)!=1)
puts("sonething wrong!");
}
fclose(fp);
}