fp = fopen(\ /* 将字符串写入文件 */
fwrite(string, strlen(string), 1, fp);
/* 取得指针位置并存入&pos所指向的对象 */ fgetpos(fp, &pos);
printf(\ /*重设文件指针的位置*/
fseek(fp,3,0);
/* 再次取得指针位置并存入&pos所指向的对象 */ fgetpos(fp, &pos);
printf(\fclose(fp); return 0; }
例程说明:
(1)首先,程序以读写方式打开一个名为test.txt的文件,并把字符串\写入文件。注意:字符串共14个字节,地址为0~13。用fwrite函数写入后,文件指针自动指向文件最后一个字节的下一个位置。即这时的fp的值应该是14。
(2)再用fgetpos函数取得指针位置并存入&pos所指向的对象,此时, pos中的内容为14。然后在屏幕上显示出The file pointer is at byte 14。 (3)再用fseek函数重设文件指针的位置,让fp的值为3,即指向文件中第4个字节。 再次取得指针位置并存入&pos所指向的对象。然后在屏幕上显示出The file pointer is at byte 3。
fgets:从流中读取字符串函数
函数原型:char *fgets(char *string, int n, FILE *fp); 头文件:#include
返回值:返回地址string,若遇到文件结束符或出错,返回NULL。用feof 或ferror判断是否出错。
例程如下:用fgets函数从文件中读取字符串。
#include
FILE *fp;
char string[] = \ char str[20];
/* 以读写的方式打开一个名为test.txt的文件 */ fp = fopen(\ /* 将字符串写入文件 */ fwrite(string, strlen(string), 1, fp); /* 文件指针定位在文件开头*/
fseek(fp, 0, SEEK_SET);
/* 从文件中读一个长为strlen(string)的字符串 */ fgets(str, strlen(string)+1, fp);
/* 显示该字符串 */ printf(\fclose(fp); return 0; }
例程说明:
(1)首先,以读写的方式打开一个名为test.txt的文件,并将字符串写入文件。 应用fseek函数将文件指针定位在文件开头。
(2)从文件中读一个长为strlen(string)的字符串,这里应注意第二个参数若为n,则表示从fp所指的文件中读取一个长度为(n-1)的字符串。因此,这里的参数为strlen(string)+1,表示读取一个长度为strlen(string)的字符串。把字符串读到以str为首地址的数组中。 (3)最后显示该字符串。
fopen、fclose:文件的打开与关闭函数
函数原型:FILE *fopen(char *filename, char *type);
int fclose(FILE *fp);
头文件:#include
函数功能:函数fopen:打开一个流,即:打开一个文件。该函数有两个参数,filename是需要打开文件的文件名,type是打开文件的方式。函数fclose:关闭一个流,即:关闭一个文件,并释放文件缓冲区。fclose函数与fopen函数是相对的两个函数。fclose函数的参数是指向文件的指针,应用该函数用以在程序结束之前关闭文件,并释放文件缓冲区。这样可以保证文件的数据不流失。
在这里,特别列出所有的文件打开方式,以供大家参考。如下表所示。
文件的打开方式
文件使用方式 意义 r 只读打开一个文本文件,只允许读数据 w 只写打开或建立一个文本文件,只允许写数据 a rb wb ab r+ w+ a+ rb+ wb+ ab+ 追加打开一个文本文件,并在文件末尾写数据 只读打开一个二进制文件,只允许读数据 只写打开或建立一个二进制文件,只允许写数据 追加打开一个二进制文件,并在文件末尾写数据 读写打开一个文本文件,允许读和写 读写打开或建立一个文本文件,允许读写 读写打开一个文本文件,允许读,或在文件末追加数据 读写打开一个二进制文件,允许读和写 读写打开或建立一个二进制文件,允许读和写 读写打开一个二进制文件,允许读,或在文件末追加数据 返回值:fopen:FILE类型,如果打开的文件存在,返回指向该文件的指针;如果打开的文件不存在,则在指定的目录下建立该文件打开,并返回指向该文件的指针。fclose:整型,有错返回非0,否则返回0。
例程如下:打开并输出一个文件,然后关闭。
#include
FILE *fp;
char buf[11] = \
/* 以写方式打开文件名为test.txt的文件 */ fp = fopen(\
/*把字符串写入文件中*/ fwrite(&buf, strlen(buf), 1, fp); /* 关闭文件 */ fclose(fp); return 0; }
例程说明:
(1)首先开辟一个11个字节大小的缓冲区buf,也就是数组,但预先只能存入10个字符。这是因为C语言中规定数组存放字符串时,最后一个字节要以’/0’结尾,作为结束标志,并由系统自动在字符串末尾添加’/0’标志。因此,11个字节大小的缓冲区只存放一个长10个字节的字符串。
(2)用fopen函数以写的方式打开一个名为test.txt的文件并将字符串写入文件。 调用fclose函数关闭该文件。
(3)fclose函数与fopen函数正好相对,其作用是关闭一个文件。当使用fopen函数打开一个文件时,会返回一个指向该文件的指针。在该例程中这个指针被赋值给fp,也就是说fp指向了test.txt这个文件。而当调用fclose函数关闭该文件,即fclose(fp)时,fp就不再指向该文件了,相应的文件缓冲区也被释放。
注意:用户在编写程序时应该养成及时关闭文件的习惯,如果不及时关闭文件,文件数据有可能会丢失。
fprintf:格式化输出函数
函数原型:int fprintf(FILE *fp, char *format[, argument,...]); 头文件:#include
函数功能:把argument的值以format所指定的格式输出到fp指向的文件中。这个函数理解起来和printf类似,在一般的使用中,第二个参数可以是一个字符串的头指针,也可以就是一个字符串。例如:fprintf(fp, \,意思就是把字符串Cannot open this file!!输出到文件fp中去。该函数一般用作终端的出错提示或是在磁盘中生成错误报告。
返回值:如果正确返回实际输出字符数,若错误则返回一个负数。 例程如下用fprintf函数向终端发出出错提示。
#include
FILE *fp;
/*以只读方式打开名为test.txt的文件*/
if ((fp = fopen(\ == NULL) {
fprintf(stderr, \
return 1; /*若该文件不能打开,在屏幕上显示出错提示*/ }
/*若该文件能够打开,在屏幕上显示正确提示*/ fprintf(stderr,\return 0;
}
例程说明:
(1)首先,以只读方式打开名为test.txt的文件,如果文件不能打开,这返回NULL。 (2)若该文件不能打开,在屏幕上显示出错提示。 (3)若该文件能够打开,在屏幕上显示正确提示。
注意:该函数中第一个参数是stderr,这是C语言中标准出错输出指针,它指向标准的出错输出文件,也就是显示器。因为,在操作系统中,I/O设备都是用文件进行管理的,因此设备都配有相应的控制文件。在C语言中,有三个文件与终端相联系,因此系统定义了三个文件指针。见下表:
设备文件 标准输入 标准输出 文件指针 stdin stdout 标准文件指针
stderr 标准出错输出
在系统运行时,程序自动打开这三个标准文件。
本例程的运行结果为: (1)如果不能打开文件:
Cannot open this file!!
(2)如果可以打开文件:
Have open this file!!
例程如下用fprintf函数在磁盘中生成错误报告。
#include
FILE *fp1,*fp2;
/*以只读方式打开名为test.txt的文件*/ if ((fp1 = fopen(\ == NULL) { /*若文件打不开,则生成错误报告*/ fp2=fopen(\ fprintf(fp2, \return 1; } return 0; }
例程说明:
(1)首先,以只读方式打开名为test.txt的文件,如果文件不能打开,这返回NULL。 (2)若该文件不能打开,则以写的方式打开一个名为report.txt的文件,并按照格式要求向文件中写入字符串\,即生成了一个错误报告。
注意:这里函数fprintf的第一个参数为文件指针,是用户自定义的,与上一例程的系统定义的文件指针stderr不同。fprintf函数与printf函数的使用类似,其实printf函数是fprintf函数的一个特例,printf函数只能向标准输出文件(显示器)输出数据,而fprintf函数也可以向一般用户定义的文件输出数据。
fputc:向流中输出字符函数
函数原型:int fputc(char ch, FILE *fp); 头文件:#include
函数功能:将字符ch输出到fp指向的文件中。该函数与前边提到的fgetc是相对的,第一个参数ch是字符型变量,函数将该变量中的字符输出到fp指向的文件中。
返回值:成功返回该字符,否则返回非0。 例程如下应用fputc向文件输出字符。
#include
char str[] = \int i = 0; /*将数组中的字符循环输出至屏幕*/ while (str[i]) {
fputc(str[i], stdout); i++; } return 0; }
例程说明:
(1)首先初始化字符数组str。这里应当知道,在C语言中初始化数组,系统会自动在数组最后添加\,以表示该字符串结束。
(2)将数组中的字符循环输出至屏幕。这里注意两点:
? 该循环以\作为结束标志,即循环碰到\时结束。
? 函数fputc的第二个参数是stdout,前面已讲过它代表标准输出文件指针,这
样就是在屏幕上显示该字串。
本例程的运行结果为:
This is a test
fputs:向流中输出字符串函数
函数原型:int fputs(char *string, FILE *fp); 头文件:#include
函数功能:将string所指的字符串输出到fp指向的文件中。该函数与fgets相对,第一个参数为字符串指针。与fgets函数不同的是,fputs函数没有字符串长度的限制,只是将string指向的字符串输出到文件中。
返回值:成功返回0,否则返回非0。
例程如下应用fputs函数向文件中输出字符串。
#include
FILE *fp;
char str[]=\