原型:FILE * fopen(const char*filename, const char*mode);
功能:打开以filename所指向的字符串为文件名的文件,使之与一个流关联。
返回值:打开成功,返回一个指向FILE类型结构变量,即文件指针,否则返回NULL
所在头文件:stdio.h
实例:
FILE * fptr;
if(fptr=fopen("client.dat","r+")==NULL)
printf("File could not be opened.\n");
else
{
//相关的文件操作。
}
注意: 从ASCII文件读取数据到内存时,系统自动将回车换行符转换成一个换行符;在输出内存数据到ASCII文件时,将换行符转换成回车和换行两个字符。\n:回车换行,0D:回车, 0A:换行
2.文件打开的方式:
r —— 文件必须存在,以只读的方式打开一个ASCII文件
w —— 如果文件存在,以只写的方式打开一个ASCII文件,原文件内容全部删除;如果文件不存在,则新建。
a —— 如果文件存在,则打开一个把数据追加到ASCII文件末尾;如果文件不存在,则新建。
r+ —— 文件必须存在,以即可读又可写(更新数据)的方式打开一个ASCII文件。
w+ —— 如果文件存在,以即可读又可写(更新数据)的方式打开一个ASCII文件,原文件内容全部删除;如果文件不存在,则新建。
a+ —— 如果文件存在,则以即可读又可写打开一个把数据追加到ASCII文件末尾;如果文件不存在,则新建。
rb/wb/ab/r+b/w+b/a+b —— 对二进制文件的操作,其含义同ASCII文件操作。
3.文件关闭——fclose()原型:int fclose(FILE * stream);
功能:关闭文件指针stream所指向的文件,将所有未回写缓冲的数据写入文件,断开文件和流的关联,释放文件占用的资源,如缓冲区,FILE类型记录占用的内存等。
返回值:如果正常关闭文件则返回0,否则返回EOF。
所在头文件:stdio.h
实例:
fclose(fptr);
3.文件定位
所在头文件:stdio.h
(1)位置指针复位函数——rewind()
原型:void rewind(FILE*stream);
功能:把文件位置指针重新定位到文件起始位置(即0字节处)
返回值:无
(2)随机读写文件——fseek()
原型:int fseek(FILE*stream, 位移量, 参照点);
功能:将指定文件的位置指针,从参照点开始,移动指定的位移量
i)参照点:SEEK_SET 值为0,表示文件头;SEEK_CUR 值为1,表示当前位置;
SEEK_END 值为2,表示文件尾。
ii)位移量:以参照点为起点,向前(位移量>0)或向后(位移量<0)移动的字节数。
实例:
fseek(fptr,10,SEEK_SET); //从文件头(0字节处)向后移动10字节(10字节处)
(3)返回文件当前位置的函数——ftell()
原型:long ftell(FILE *stream);
功能:返回文件位置指针的当前位置
返回:返回文件位置指针的当前位置,即用相对于文件头的位移量表示。如果返回值为-1L,则表明调用出错。
实例:
offset=ftell(fp);
if(offset= =-1L)
printf(“ftell() error\n”);
else
{
//相关的文件操作。
}
4.文件的读写操作
所在头文件:stdio.h
(1)将一个字符写入指定文件——fputc()原型:int fputc(int c, FILE *stream)
功能:将c所指定字符写入stream所指向的输出流中,文件位置指针向前移动一个字节。
返回值:返回输出的字符数据;否则,返回一个符号常量EOF(其值在stdio.h中定义为-1)
实例:
fputc('A', fptr); //在fptr处写入'A',文件位置指针后移1个字节
fputc(c,stdout); //定价于putchar(c);
(2)从指定文件读取一个字符——fgetc()
原型:char fgetc(FILE * stream);
功能:从stream所指向的输入流获取下一个unsigned char类型的字符并转换成int类型,同时将文件位置指针向前移动1个字节。
返回值:返回读取的字符,如果到文件尾,设置该流的文件结束指示符并返回EOF;读错则设置该流的错误指示符并返回EOF。
实例:
ch=fgetc(fptr); //从fptr读取一字符到ch中,同时将fptr的文件位置指针向前移动到下一个字符
c=fgetc(stdin); //定价于c=getchar();
(3)向文本文件输出一个字符串——fputs()
原型:int fputs(const char* s, FILE *stream);
功能:将s所指向的字符串写入stream所指向的流中(‘\0’不被写入)。同时将文件位置指针向前移动字符串长度个字节,指向下一写入位置。
返回值:如果发生写错误,则函数返回EOF;否则,返回一个非负值。
实例:
fputs("Hello world!", fptr); //在当前文件指针位置写入Hello world!
fputs(s, stdout); //定价于puts(s);
(4)从文本文件读一个字符串——fgets()
原型:char * fgets(char * s, int n, FILE *stream);
功能:从stream指向的流中读取最多n-1个字符并放到s所指向的数组中,遇到下面情况不再往后读:
i)读到新行符‘\n’或者文件结束符,但写入s所指向的数组中;
ii)或虽未遇新行符和文件结束符、但已读入n-1个字符。最后一个字符读入数组后接着写入结束标志‘\0’ ,并将文件位置指针向前移动n-1(字符串长度)个字节。
如果遇到文件结束符并且没有字符读入数组,则数组内容不变。键盘输入时,以CTRL+Z作为结束字符。返回值:如果成功返回值等于获得的字符串的首地址。 如果出错,或者读到FILE的结尾,返回NULL.
实例:
char s[100];
fgets(s,100,fptr); //假设文件足够长,实际上s中只有99个字符,最后一个位置为结束标志'\0'
fgets(s,sizeof(s),stdin); //定价于gets(s);
(5)对文件格式化读——fscanf()
原型:int fscanf(FILE * stream, const char * format, 输入变量首地址表)
功能:函数从stream指向的标准输入流中读取字符序列,按照format中的格式规格说明对字符序列进行解释,并把结果存储在变量中。从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
返回值:当能正常读入数据时, fscanf 返回读入数据的个数,否则返回 EOF 。
实例:
fscanf(fptr, "%d,%f", &i,&f);
fscanf(stdin, "%d,%f", &i,&f); //等价于scanf("%d,%f", &i,&f);
(6)对文件格式化写——fprintf()
原型:int fprintf(FILE * stream, const char * format,输出参量表);
功能:函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件.
返回值: fprintf()的返回值是输出的字符数,发生错误时返回一个EOF.
实例:
int i = 3; float f = 9.80;
fprintf(fptr, "%2d, %6.2f", i, f); //将变量i按%2d格式、变量f按%6.2f格式, 以逗号作分隔符,输出到fPtr所指向的文件中:□3,□□9.80(□表示1个空格)
fprintf(stdout, "%2d, %6.2f", i, f); //等价于printf("%2d, %6.2f", i, f);
(7)在二进制文件读一数据块——fread()原型:int fread(void * buffer, int size, int count, FILE * stream);
功能:从stream所指向的流中读取数据到buffer所指向的数组中, size表示单个数组元素的大小,最多读取count个数组元素,流的文件位置指针根据成功写入的字节数递增。
返回值: 函数返回成功读入的元素个数。如果发生读错误,则返回值可能小于count。
实例:
struct student stu[3], astu;
fread(stu, sizeof(struct student), 3, fptr); // 从文件读取3条记录写入数组stu中
fread(astu, sizeof(struct student), 1, fptr); //一条记录写入结构变量aStu中
fread(&ch, sizeof(char), 1, fptr); //读取一个字节写入字符变量ch中
(8)在二进制文件写一数据块——fwrite()
原型:int fwirte(void * buffer, int size, int count, FILE * stream)
功能:将buffer所指向的数组内容写入stream所指向的流中。size表示单个数组元素大小,最多写入count个数组元素,流的文件位置指针根据成功写入的字节数递增。
返回值:函数返回成功写入的元素个数,如果遇到错误,返回值可能小于count
实例:
struct student stu[3], astu;
fwrite(stu, sizeof(struct student), 3, fptr); //把数组stu中所有元素一次性写入文件
fwrite(&astu, sizeof(struct student), 1, fptr); //把变量astu中的内容写入文件
fweite(ch, sizeof(ch), 1, fptr); //把字符变量写入文件
(1)ASCII码文件:在对ASCII码文件执行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志EOF(其值在头文件stdio.h中被定义为-1)。(见fgetc(), fgets()定义)
实例:
ch=fgetc(stdin);
while(ch!=EOF)
{
fputc(ch,fptr);
ch=fgetc(stdin);
}
(2)判断是否读到文件末尾——feof()
原型:int feof(FILE * stream);
功能:判断文件是否读到文件尾,适用于ASCII码文件和二进制文件
返回值:如果到文件尾,则返回1;否则返回0.
实例:
FILE * sfptr = NULL, dfptr = NULL;
if((sfptr=fopen("input.txt","r"))!=NULL)
{
if((dfptr=fopen("output.txt","w"))!=NULL)
{
ch = fgetc(sfptr); //从input.txt文件读取一个字符
while(!feof(sfptr)) //逐字符复制
{
fputc(ch, dfptr);
ch = fgetc(sfptr);
}
fclose(dfptr);
}
fclose(sfptr);
}
注意:feof(fptr)!=EOF是无法判断是否读到 文件末尾的!是错误的写法。