- 文件操作
- 1.文件型指针变量
- 2.文件的打开
- 3.文件的关闭
- 4.文件的读写
- 字符读写函数:
- 字符串读写函数:
- 数据块读写函数:
- 格式化读写函数:
- 顺序读写和随机读写:
- ftell函数
- ferror函数
- clearerr函数
文件操作
C语言的文件操作相关内容
1.文件型指针变量
FILE *fp;
其中fp是一个指向FILE类型结构体的指针变量,结构的具体定义为
typedef struct _iobuf
{
void* _Placeholder;
} FILE;
一般来说,可以通过fp指向某一个文件的结构体变量,从而通过该结构体变量中的文件信息能够访问该文件。当有多个文件的时候,可以设置多个指针变量,分别指向到各个文件,以实现对文件的访问;
可以使用FILE类型的数组:
FILE file[5]; //定义一个结构体数组,有5个元素,可以用来存放5个文件的相关信息2.文件的打开
FILE *fp; fp = fopen(文件名,使用文件方式); // 文件使用方式:只读(“r”),只写(“w”)
其中需要注意的是:
“r”打开一个文件时,该文件必须已经存在,只读;
“w”打开一个文件时,若文件不存在,则以指定文件名建立该文件,若文件已存在,则将该文件删除,重建一个文件;
“a”向一个已存在的文件追加新的信息;
另外,打开一个文件时,如果出错,fopen将返回一个空指针NULL,可以用这一个信息来判断是否完成打开文件的动作,并进一步做相应的处理。
3.文件的关闭通过调用函数fclose(文件指针);
4.文件的读写字符读写函数:fgetc和fputc
字符串读写函数:fgets和fputs
数据块读写函数:fread和fwrite
格式化读写函数:fscanf和fprintf
使用上述函数时,都要包含stdio.h
fgetc函数,在调用过程中,文件必须是以读或读写方式打开。同时在文件内部会有一个位置的指针,用来指向文件的当前读写字节,当文件打开是,指针总是会指向文件的第一个字节,使用fgetc之后,该位置指针将向后移动一个字节,因此可以多次使用fgetc函数读取多个字符。当读到EOF时,代表读到最后了(对于二进制文件使用feof(fp),如果函数feof的返回值为1代表文件结束,否则文件未结束)。
这里要说明的是,文件指针和文件内部的位置指针是两个概念,后者是系统自动设置的。
fgets函数
函数调用一般格式:
fgets(str,n,fp); //函数作用从fp所指的文件中独处n-1个字符送入字符数组str中 //函数原型为:char * fgets(char *_Buffer, int _MaxCount, FILE *_Stream) //特殊的,还可以从键盘获取字符串,键盘在系统中也被认为是一个文件 //fgets(buffer,LEN,stdin); //stdin可以理解为使键盘的输入保存的一个“临时”的文件
这里是n-1个的原因是因为会自动填充一个‘ ’到字符串结尾。一共构成一个n个字符的字符串,返回值为字符串的首地址。
fputs函数
函数一般格式:
fputs("string",fp); //把字符串string写入fp所指向的文件之中
//函数原型为:int fputs(const char *_Buffer, FILE *_Stream)
输入成功返回0,输入失败返回EOF。
数据块读写函数:fread函数:
函数调用一般格式:
fread(buffer,size,count,fp);
fwrite函数:
函数调用一般格式:
fwrite(buffer,size,count,fp);
其中,buffer:是一个指针,对于fread来说,它是读入数据的存放地址,对于fwrite来说,是要输出数据的地址,均指的是起始地址。
size:要读写的字节数;
coutn:要进行读写多少个size字节的数据项;
fp:要操作的文件;
举例说明:
struct student_type
{
char name[10];
int num;
int age;
char addr[30];
}student[40];
//可以用fread和fwrite来进行数据的操作
for(i=0;i<40;i++)
{
fread(&student[i],sizeof(struct student_type),1,fp);
}
for(i=0;i<40;i++)
{
fwrite(&student[i],sizeof(struct student_type),1,fp);
}
//以上就是按照块的格式进行操作的意义,不会打乱块内的数据顺序和数据本身
格式化读写函数:
fprintf():
函数调用:
fprintf(文件指针,格式字符串,输出列表); fprintf(fp,"%d,%6.2f",i,t);
fscanf():
函数调用:
fscanf(文件指针,格式字符串,输入列表); fscanf(fp,"%d,%f",&i,&t);顺序读写和随机读写:
顺序读写:位置指针按字节位置顺序移动。
随机读写:读完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置的字符:
fseek函数:改变文件的位置指针
函数形式:
fseek(文件类型指针,位移量,起始点); fseek(fp,100L,0);//将位置指针移动到离文件头100个字节处 fseek(fp,50L,1);//将位置指针移到离当前位置50个字节处 fseek(fp,50L,2);//将位置指针从文件末尾向后退50个字节 fseek(fp,i*sizeof(struct stu),0);
起始点:
文件开头 SEEK_SET 0
文件当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
位移量:
以起始点为基点,向前移动的字节数,注意理解这里的“前”的含义;
函数作用:得到流式文件中的当前位置,用相对于文件开头的位移量来表示。
返回值:返回当前的位置,出错时返回-1L。
一般使用例子:
i=ftell(fp);
if(i==-1L)
{
printf("errorn");
}
出错的检测:
ferror函数使用例子:
ferror(fp); //返回值0:表示未出错; //返回非0值:表示出错;
需要注意的是,在调用一个输入输出函数后立即检查ferror函数的返回值,否则信息会丢失 ,使用fopen函数时,ferror函数的返回值自动置为0。
clearerr函数调用形式:
clearerr(fp); //使文件错误标志和文件结束标志置为0 //只要出现了错误标志,就会一直保留,知道对同一文件调用了clearerr函数和rewind函数,或者其他的输入输出函数



