§9.5.1 文件应用实例
一、建立二进制文件并显示
例9-4 把一个浮点数组以二进制方式写入文件 fc.dat 中,再从文件 fc.dat 中读取出并显示。
#include <stdio.h>
main( )
{
float a[ 6 ] = { 15.2, -24.3, 5.04, 0.71, 50.6, 50.5 };
int i, k; float dat[100];
FILE *fp;
fp = fopen ("fc.dat", "wb"); /* 创建一个二进制文件只写 */
if( fp == NULL )
{ printf("不能打开文件!n"); exit( ); }
fwrite( a, sizeof( float ), 6, fp ); /* 将6个浮点数写入文件中 */
fclose( fp ); /* 关闭文件 */
fp=fopen ("fe.dat","rb");
if( fp == NULL )
{ printf("不能打开文件!\n"); exit(); }
k=fread( dat, sizeof(float), 100, p); /* 返回读取的浮点个数y */
for( i = 0; i < k ; i++ )
printf( "%7.2f" , dat[i] );
fclose( fp );
}
运行结果如图96所示。
执行“fp=fopen("fc.dat,"wb");”后,如果返回值为“NULL”说明打开文件"fe.dat”失 ,可能因为磁盘空间不够,执行“exit();”结束程序运行:执行“p=fopen(”e.at,b”)”后,如果返回值为“NULL”,说明不能打开文件“fc.dat”,可能因为不存在该文件或没有相应限。
二、建立记录文件并显示
例9-5 将3个学生记录存入一个磁盘文件d中,再从文件fdat中读出并显示
#include <stdio.h>
#define N 3
#define LEN sizeof( STU )
typedef struct node {
char name[ 10 ];
int score;
} STU;
main( )
{
FILE *fp;
STU s[ N ];
int i = 0;
fp = fopen( "fd.dat", "wb");
printf("输入:\n 姓名\t 成绩 \n");
for( ; i<N; i++)
{
scanf("%s%d", s[i].name, &s[i].score );
fwrite( &s[i], LEN, 1, fp);
}
fclose( fp );
fp = fopen("fd.dat","rb");
printf("\n 输出:\n\t 姓名 \t 成绩 \n");
printf("------------------------------------\n");
for(i = 0; i<N; i++)
{
// 从文件中读一个记录存于 s[i] 中
fread( &s[i], LEN, 1, fp );
// 在屏幕上输出s内容
printf ("%10s \t %5d \n", s[i].name, s[i].score );
}
fclose( fp );
}
运行结果如图9-7所示。
31 图9-7例9-5运行结果
例9-6 从键盘上输入若干行文本(每行不超过80个字符),写到文件f.xt中,用-1作为字符串输入结束的标志,然后将文件的内容读出并显示在屏幕上。文件的读写分别由自定文数ReadText()和WriteText()实现。
#include <stdio.h>
// 写入文件fname
int WriteText( char fname[ ] )
{
FILE *fp;
char line[ 80 ], *r="-1";
fp = fopen( fname, "w"); //以写方式打开文件
int n=0;
printf“输入若干行文本,输入一1结束。n");
do {
gets( line ); //读入一行
if( strcmp( line, r) == 0 ) break; //若为串结束标志,则返回
fputs( line, fp ); // 写入一行
fputc( '\n', fp ); //行尾增加换行符
n ++ ;
} while( 1 );
fclose( fp );
return n;
}
//读出fname文件
void ReadText( char fname[ ], int n )
{
char line [80];
int i;
FILE *fp;
fp =fopen fname,"r"); // 以读方式打开文件
printf("n输出文件%s内容:n",fname);
for ( i=1; i<n; i++)
{
fgets( line, 80, fp ); //读一行字符并显示
printf("%s",line );
}
fclose(fp )
}
main( )
{ char fname[30];
int n;
printf("输入磁盘文件名:");
gets( fname );
n=WriteText( fname ); //写文件
ReadText (fname,n ); // 读文件
}
运行结果如图9-8所示。
说明:因为每行字符个数不同,也可用fgetc函数读取一个个字符并量示,改写函数 ReadText 如下:
void ReadText( char fname[ ] ) // 读出fname文件
{
char line[ 80 ];
int i;
FILE *fp;
fp = fopen( fname, "r"); // 产以读方式打开文件
printf("n输出文件%s内容:\n", fname );
while( ! feof( fp ) ) //产未到文件结尾
{
ch=fgetc( fp ); //产读一一个字符并显示
putchar( ch );
}
fclose( fp );
}
调用形式改为:“ReadText(fname):”即可。

