四.常用库函数对文件的操作函数和实例
FILE不是结构体变量,它是用typedef定义的新类型名,
(1)fopen
FILE*fp;
fp=fopen(char*filename,char *mode)
打开一个文件名为filename的文件,打开方式为mode
FILE*fp;
if((fp=fopen(“filename”,”r”))==NULL)
{
printf(“filecannot be opened!\n”);
exit(0);
}
mode可为:rt,wt,at; rb,wb,ab; rt+,wt+,at+; rb+,wb+,ab+(也可以不加t,eg:r,w,a,默认的就是t即文本文件)
(2)fclose(FILE *stream)
关闭FILE结构体指针变量对应的文件成功返回0,否则返回非零
(3) char fgetc(FILE *stream)
从指定文件中读取一个字符,函数返回值就是该字符,若遇到文件结束符EOF则返回-1
(4) char fputc(char ch,FILE *stream)
将字符ch的值写入所指定文件的当前位置处,并将文件指针后移一位,函数的返回值是所写入的字符,出错返回-1遇到文件尾返回EOF.
eg1.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{ FILE*fp;
charch;
if((fp=fopen("test1.txt","r"))==NULL)
{
printf("Thisfile cannot be opened!\n");
exit(1);
}
ch=fgetc(fp); /*注意换行符照样读出*/
while(ch!=EOF) /*这里也可以写成ch!=-1*/
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
return0;
}
(5)fegts(字符数组名,n,文件指针)
从文件指针指定文件中读取n-1个字符,并把它送到字符数组中,函数在读入字符串后将自动加上字符串结束标志’\0’,因此送到字符数组中的字符为n个,在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束(也就是说只要n足够大,fgets读出的就是一行,并且’\n’也会读入到字符串),函数返回值就是字符数组的首地址。
注意:fgets(buff,512,stdin);表示用键盘输入数据到buff中,最多可接受512个字节,这个可以接收空格,而scanf函数不能接收空格
(标准输入stdin,标准输出stdout,标准错误输出stderr)
(6)fputs(字符串,文件指针)
把字符串写入文件指针指定的文件中,字符串可以是字符串常量,也可以是字符数组名
(7) int fscanf(FILE *stream,char*format,arg_list)
int fprintf(FILE*stream,char *format, arg_list)
按指定的格式对文件进行格式化的输入和输出,stream为流文件指针,其余两个参数与scanf和printf用法相同
(8) rewind(fp)
把文件内部的文件指针移到文件首
(9) fseek(文件指针,位移量,起始点)
把文件内部位置指针移到指定位置,“位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB时不会出错,当用常量表示位移量时要加后缀“L”
起始点: 表示符号: 数字表示:
文件首 SEEK_SET 0
当前位置 SEEK_CUR 1
文件末尾 SEEK_END 2
(10) fread(buff,size,count,fp)
fwrite(buff,size,count,fp)
以数据块的形式读写文件,size是数据块的大小,count是执行一次函数读取或写入数据块的个数
eg2:
#include <stdio.h>
int main(void)
{
chars[40];
inti;
FILE*fp;
if((fp=fopen("test1.txt","r"))==NULL)
{
printf("openerror!\n");
return1;
}
fseek(fp,-10L,SEEK_END);
fread(s,2,5,fp);
for(i=0;i<10;i++)
putchar(s[i]);
fclose(fp);
return0;
}
eg3.
#include <stdio.h>
#define SIZE 4
struct student_type
{
charname[10];
intnum;
intscore;
}stud;
int main(void)
{
inti;
FILE*fp;
if((fp=fopen("stu_list","wb"))==NULL)
{
printf("openerror!\n");
return1;
}
printf("Inputdata please:\n");
for(i=0;i<SIZE;i++)
{
scanf("%s%d%d",stud.name,&stud.num,&stud.score);
fwrite(&stud,sizeof(structstudent_type),1,fp);
}
fclose(fp);
printf("Allright!\n");
return0;
}
(11) feof(fp)=1说明遇到文件尾,如果未遇到文件结尾feof(fp)=0;
eg4.
#include<stdio.h>
int main(void)
{
FILE *fp;
char ch;
if(NULL==(fp=fopen("test1.txt","r"))) /*注意这种写法*/
{
printf("open error!\n");
return 1;
}
ch=fgetc(fp);
while(!feof(fp)) /*这里也可以写成while(feof(fp)!=1)*/
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
return 0;
}
(12)long ftell(FILE *fp)
用于得到文件位置指针当前位置相对于文件首的偏移字节数
计算文件大小: long flen;
fseek(fp,0L,SEEK_END); /* 定位到文件末尾 */
flen=ftell(fp); /* 得到文件大小 */
(13)
调用系统库要用头文件<unistd.h>
调用标准库函数要用头文件<stdlib.h>