C程序设计中用好“文件指针”及“字符型指针数组”
摘要:文件指针是指向一个结构体类型的指针变量,在这个结构体中包含有诸如:缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读”还是“写”、是否出错、是否经遇到文件结束标志等信息。字符型指针数组是指向字符型数组的指针,常用字符串数组的定义及字符串的引用等。用好、用活这两种类型的指针,在c程序设计中会起到事半功倍的效果,否则会出现意想不到的错误。
关键词:文件指针  字符型指针数组  字符串  字符串数组  fgets函数    fputs函数
文件指针是指向一个结构体类型的指针变量,在这个结构体中包含有诸如:缓冲区的地址、在缓冲区中当前存取的字符的位置、对文件是“读”还是“写”、是否出错、是否经遇到文件结束标志等信息。文件指针定义的一般形式为:
file *指针变量名;
例如:
file *fp1,*fp2;
这里fp1fp2均被定义为指向文件类型的指针变量,称为文件指针。
字符型指针数组是指向字符型数组的指针,常用字符串数组的定义及字符串的引用等。
字符型指针数组定义的一般形式为:
char *数组名[];
例如:
char *fname1[10],*fname2[10];
这里fname1fname2均被定义为指向字符型数组的指针变量,称为字符型数组指针。
字符串数组定义的一般形式为:
char 数组名[][];
例如:
char fname1[10][10],fname2[10][10];
这里fname1fname2均被定为字符串数组变量,称为字符串数组变量。
函数fputs用来把字符串输出到文件中,其一般形式为:
fputs(str,fp);
这里,fp是文件指针;str是待输出的字符串,可以是字符串常量、指向字符串的指针或存放字符串的字符数组名等。用此函数进行输出时,字符串中最后的’\0’并不输出,也不自动加’\n’。输出成功函数值为正整数,否则为-1(eof)。注意:调用此函数输出字符串时,文件中各字符串将首尾相接,它们之间将不存在任何间隔符。为了便于读入,在输出字符串时,应当注意人为地加入诸如”\n”这样的字符。
函数fgets用来从文件中读入字符串,其一般形式为:
fgets(str,n,fp);
这里,fp是文件指针;str是存放字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指的文件中读入n-1个字符放入str为起始地址的空间内;如果在未满n-1个字符时,已读到
一个换行符或一个eof(文件结束标志),则结束本次操作,读入的字符串中最后包含读到的换行符。注意:调用fgets函数时,最多只能读入n-1个字符,读入结束后,系统将自动在最后加’\0,并以str作为函数值返回;参数str通常是数组名,而不能是指针,否则将会出现意想不到的错误。
我们首先来看一个案例:
请调用fputs函数,把10个字符串输出到文件中;再从此文件中读入这10个字符串放在一个字符串数组中;最后把字符串数组中的字符串输出到终端屏幕,以检验所有操作是否正确。
分析:根据题意及要求,这十个字符串可用两个字符串数组fname1[10][10]fname2[10][10]存放;也可以将要输出到文件中的10个字符串用字符型指针数组*fname1[10]存放,而将要输出到终端屏幕的10个字符串按要求用字符串数组fname2[10[10]存放;这十个字符串也可用两个字符型指针数组*fname1[10]*fname2[10]存放。用文件指针fp用以打开需要输出的文件file_f.dat
根据分析得出程序清单一如下:
/
*program1*/
#include stdio.h
#include stdlib.h
#include string.h
main()
{file *fp;
char fname1[10][10]={a,bb,ccc,dddd,eeeee,ffffff,ggggggg,hhhhhhhh,i,jjjjj};
/*字符串数组fname1[10][10]存放输出到文件file_f.dat中的10个字符串*/
char fname2[10][10]; /*字符串数组fname2[10][10]存放从文件file_f.dat中读入的10个字符串*/
int i;
i=0;
while(i<10) puts(fname1[i++]);/*输出已赋初值的字符串数组fname1,以检验是否正确*/
if((fp=fopen(file_f.dat,w))==null)/*用文件指针fp打开文件file_f.dat*/
{printf(open data error!\n);exit(0);}
i=0;
while(i<10)fputs(fname1[i++],fp);/*将字符串数组fname1中的10个字符串输出到文件指针fp指向的文件file_f.dat*/
i=0;
while(i<10){fgets(fname2[i],strlen(fname1[i])+1,fp);i++;}/*从文件指针fp指向的文件file_f.dat中读入10个字符串并存放到字符串数组fname2*/
fclose(fp);
i=0;
while(i<10)puts(fname2[i++]);/*输出字符串数组fname2中的10个字符串*/
}
分析:调试运行,输出字符串数组fname2中的10个字符串为’?’或’屯’等乱字符,其原因为文件指针fp只按文件file_f.dat的写”w”属性打开了文件,而没有按”r”属性打开文件file_f.dat。所以导致读到字符串数组fname2c 字符串转数组中的字符串为乱字符。解决的办法是在语句fclose(fp);后加入语句段:
if((fp=fopen(file_f.dat,r))==null)/*用文件指针fp以”r”方式打开文件file_f.dat*/
{printf(open data error!\n);exit(0);}
即可。
程序清单二如下:
/*program2*/
#include stdio.h

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。