注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

古城风~~~

竹密无妨溪水过,天高不碍白云飞。这天下总有一份是属于我古城的天地!

 
 
 

日志

 
 

文件的读写  

2008-04-22 20:47:19|  分类: c/c++类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

转载于:http://col.njtu.edu.cn/course/xnjp/jsjxy/jsjcxjc/file4.htm

文件被打开后,立即可以执行读写操作.在下面的函数中所应用的fp是指文件指针变量,它从fopen( )函数得到返回值,在下面使用fp之处,不再另加说明.

文件的读写 - 古城风 - 古城风~~~测试文件尾函数--feof( )函数

调用方式: feof(fp) 该函数用来测试fp所指向的文件的当前状态: 文件结束,函数值为1 否则值为0

文件的读写 - 古城风 - 古城风~~~读写一个字符函数--函数fgetc()和fputc()

调用形式分别为: ch=fgetc(fp); fputc(ch,fp); fgetc()函数将fp指向的文件的一个字符读到内存,赋给字符变量ch.如果遇文件结束符时,函数返回值为1. 为便于书写,在stdio.h中将fgetc()和fputc()定义宏名为getc()和putc():

#define getc(fp) fgetc(fp)

#define putc(ch,fp) fputc(ch,fp)

例:从键盘输入一些字符逐个送入磁盘,直到#为止。再将此盘文件读入内存,逐个显示在光屏。

# include "stdio.h"

main( )

{FILE *fp;

char ch,filename[10];

scanf("%s",filename); /*读入磁盘文件名*/

if((fp=fopen(filename,"w"))==NULL) /*建立新文件 */

{ printf("cannot open file\n"); /*建立新文件出错误信息*/

exit(1); /*终止调用过程、关闭所有文件*/

}

ch=getchar( ); /*从键盘读入一个字符*/

while(ch!='#') /*读到#时停止输入*/

{ fputc(ch,fp); /*将ch内字符写入fp指向的文件*/

ch=getchar( );

}

close(fp); /*关闭fp所指向的文件*/

if((fp=fopen(filename,"r"))==NULL) /*将filename 以'r'方式打开*/

{printf("cannot open file\n");

exit (1);

}

ch=fgetc(fp); /*从fp指向的文件读一个字符给ch变量 */

while(ch!=EOF) /*读到文件结束符EOF时结束 */

{putchar(ch);

ch=fgetc(fp);

}

fclose(fp); /*关闭文件*/

}

请你运行程序,按如下的输入,可以得到如下的结果:

file.c basic、fortran and c

computer #

basic、fortran and c

computer

用DOS命令TYPE检查file.c的内容:

C:>TYPE file.c

basic、fortran and c

computer

文件的读写 - 古城风 - 古城风~~~读写数据块函数--fread( )和fwrite( )函数

调用方式分别为: fread(buffer,size,count,fp);

该函数将fp指向的文件的数据以数据块的形式读入内存buffer。

fwrite(buffer,size,count,fp);

该函数将内存buffer的内容以数据块的形式写入fp指向的文件。 其中: buffer:是一个指针。对于fread来说 它是读入数据的有效地址。对 fwrite来说,是要写盘的数据地址(起始地址)。 size:要读写的字节数。 count:要进行读写多少个size字节的 数据项。 fp:文件型指针 如果fread或fwrite调用成功,则函数返回值为count的值。 若文件以二进制形式打开,用fread和fwrite函数就可以读写任何类型的信息。如: fread(f,4,2,fp); f为实型数组名,4表示个实型变量占4个字节,2表示读入2次,fp向的文件数据.

例:从键盘输入4个学生的有关数据,然后把它们转存到磁盘文件上去。

#include"stdio.h"

#define SIZE 4

struct student_type

{char name[10];

int num;

int age;

char addr[15];

}stud[SIZE];

void save() /*save( )函数,将数据送到"stu_list"磁盘文件中去。*/

{FILE *fp;

int i;

if((fp=fopen("stu_list","wb"))==NULL)

{printf("cannot open file\n");

return;

}

for(i=0;i<SIZE;i++)

if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)

/*函数sizeof 计算一个结构体student_type的变量长度29(10+2+2+15)字节*/

printf("file write error\n");

}

main() /*在主函数main( )中的终端读入4个学生的数据,然后调用save( )函数。*/

{int i;

for(i=0;i<SIZE;i++)

scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age, stud[i].addr);

save();

}

运行情况如下。

输入4个学生的姓名、学号、年龄和地址:

zhang 1001 17 room-101

fun 1002 18 room-102

tan 1003 19 room-103

ling 1004 20 room-104

好了,数据已经存入文件中了.如何验证呢?请看例:

验证上例读入的磁盘文件"stu_list"数据是否正确,将该盘文件读入内存,并从荧屏上显示。

#include"stdio.h"

#define SIZE 4

struct student_type

{char name[10];

int num;

int age;

char addr[15];

}stud[SIZE];

main( )

{int i;

FILE *fp;

fp=fopen("stu_list","rb");

for(i=0;i<SIZE;i++)

{fread(&stud[i],sizeof(struct student_type),1,fp);

printf("%-10s%4d%4d%-l5s\n",stud[i].name, stud[i].num,stud[i].age,stud[i].addr);

}

}

程序运行时,屏幕将显示出以下信息:

zhang 1001 17 room-101

fun 1002 18 room-102

tan 1003 19 room-103

ling 1004 20 room-104

正是上例存入的数据.

程序注释:

原始数据以ASCII 形式输入到内存时,回车换行符换成一个换行符。以"wb"方式从内存写到文件"stu_list",以及再以"rb"方式将"stu_list"文件读入内存,其间都不发生字符转换。当用printf函数输出到屏幕时以ASCII 形式输出,换行符又转换为回车加换行符。

文件的读写 - 古城风 - 古城风~~~格式化读写函数--fscanf( )函数和fprint( )函数

调用方式分别是: fscanf(文件指针,格式字符串,输入表);

fscanf 函数将指针指向的文件内容,以格式符要求的形式,读入内存指定地址内 fprintf(文件指针,格式字符串,输出表);fprintf 函数是将内存指定地址内的内容,以格式符要求的形式,输出到指针指向的文件

说明: 以上两个函数与scanf( ) 和printf( )函数 只有一点不同:即前二者的读写对象是磁盘数据文件,即是文件指针指向的磁盘文件。 用fscanf( )和fprintf( )函数对磁盘文件 进行读写,使用方便,容易理解,但是,由于输入是要将ASCII码转换为二进制形式,输出时又要将二进制形式转换成字符,花费时间较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fscanf( )和fprintf( )函数,而用fread和fwrite函数。

例:编制一个程序,建立一个电话簿,包括姓名和电话号码两项内容,该程序有增加新姓名和电话号码的功能,也可以根据姓名查询已经存入电话簿的电话号码。

程序在设计时将分别设计成三个函数:

1.菜单选项--menu( )

2.增加新电话号码--add-num( )

3.查询老电话号码--lookup( )。

程序如下:

#include "stdio.h"

void add_num( ),lookup( );

main( )

{ char choice;

do{choice=menu( );

switch(choice)

{ case 'A':add_num( ); break;

case 'L':lookup( ); break; }

}while(choice!='Q');

}

menu( )

{ char ch;

do{

printf("(A)dd,(L)ookup or (Q)uit:");

ch=tolower(getche( ));

printf("\n"); }

while(ch!='Q'&&ch!='A'&&ch!='L');

return ch;

}

void add_num( )

{ FILE * fp;

char name[80];

int a_code,exchg,num;

if((fp=fopen("phone","a"))==NULL)

{ printf("cannot open directory file\n"); exit(1); }

printf("enter name and number:");

fscanf(stdin,"%s%d%d%d",name,&a_code,&exchg,&num);

fscanf(stdin,"%*c");

fprintf(fp,"%s %d %d %d n",name,a_code,exchg,num);

fclose(fp);

}

void lookup( )

{ FILE *fp;

char name[80],name2[80];

int a_code,exchg,num;

if((fp=fopen("phone","r"))==NULL)

{ printf("cannot open directory file\n"); exit(1); }

printf("name?");

gets(name);

while(!feof(fp))

{fscanf(fp,"%s%d%d%d",name2,&a_code,&exchg,&num);

if(!strcmp(name,name2))

{printf("%s: (%d)%d-%d\n",name,a_code,exchg,num); break; }

}

fclose(fp);

}

请运行程序,可以得到如下结果:

(A)dd,(L)ookup or (Q)uit:A Enter name and number: Liming 6789 1234 135

(A)dd,(L)ookup or (Q)uit:A Enter name and number: Lihung 5678 235 357

(A)dd,(L)ookup or (Q)uit:L name?Liming Liming:(6789)1234-135

(A)dd,(L)ookup or (Q)uit:Q

文件的读写 - 古城风 - 古城风~~~读入整型量函数--- getw( )函数和putw( )函数

调用方式如下例:

i=getw(fp);

它的作用是从磁盘文件读一个整数到内存,赋给整型变量i。

putw(10,fp);

它的作用是将整数10输出到fp指向的文件。

文件的读写 - 古城风 - 古城风~~~读写字符串函数-- fgets( )函数和fputs( )函数

调用方式分别为:

fgets(字符数组,n,fp);

fgets( )函数的作用是将fp指向的文件中

(n-1)个字符读入字符数组,并且加结束符“\0”,若在(n-1) 个字符前遇到EOF或换行符,均结束读入。

fputs(字符数组,fp);

fputs( )函数的作用是向指定的文件输出一个字符串。如:

fputs(“china”,fp);

说明:

fgets( )和fputs( )函数与gets( )和puts( )函数的不同之处也在于:

前二者的读写对象为指定的文件。

文件的读写 - 古城风 - 古城风~~~ 用户自定义读写函数

如果用户对于读写盘文件还有特殊的要求,或者是在某些C编译的库函数中,不包括前面所介绍的那些读写函数,用户也可以自己定义函数。

比如:

定义getw函数

getw(fp)

FILE *fp;

{char *s; int i;

s=&i;

s[0]=getc(fp); s[1]=getc(fp);

return(i);

}

定义putw函数

putw(i,fp)

int i;

FILE *fp;

{char *s;

s=&i;

putc(s[0],fp);putc(s[1],fp);

return(i);

}

  评论这张
 
阅读(358)| 评论(2)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017