#include #include

28
例例例例例例 Modify.c 例例 例例例例“ N ” 例例例例例例例例例例例 例例 例例例例例例例例 例例例 例例例例例 例例 ,(:、 例例例 例例例 、、, 例例例例例 例例 n 例例例例 n 例例 例例例 例例例例例例例例例例例 ,。

description

例: 在考生目录下,有 Modify.c 程序,该程序中“ N ” 是根据程序功能需要填充部分,请完成程序填充(注意:不得加行、减行、加句、减句, 该程序功能:输入 n 和平面上 n 个点的坐标,计算各点间距离的总和。. #include #include #define f(x1,y1,x2,y2) sqrt(pow(x2-x1,2)+pow(y2-y1,2) // 带参数的宏 1 // #include 或 #include void main( ) - PowerPoint PPT Presentation

Transcript of #include #include

Page 1: #include  #include

例:在考生目录下,有 Modify.c程序,该程序中“ N ” 是根据程序功能需要填充部分,请完成程序填充(注意:不得加行、减行、加句、减句,该程序功能:输入 n 和平面上 n 个点的坐标,计算各点间距离的总和。

Page 2: #include  #include

#include <stdio.h>

#include <math.h>

#define f(x1,y1,x2,y2) sqrt(pow(x2-x1,2)+pow(y2-y1,2) // 带参数的宏

1 // #include <stdlib.h> 或 #include <malloc.h>

void main( )

{ float *x,*y,s=0; int i,j,n;

scanf(“%d”,&n);

x=(float)malloc(sizeof(float)n*2);

y=x+ n ;

for(i=0;i<n;i++) scanf(“%df%f”,x+i,y+i);

for(i=0;i<n-1;i++)

  for(j=0;j<n;j++)

s+=f(x[i],y[i],x[j],y[j]);// 指针的下标表示法为实参

printf(“%.2f\n”,s);

}

Void *malloc ( unsigned size )在动态存储区分配一个长度为 size 的连续空间,其函数值是该区间的起始地址。若此函数未能成功的执行,则函数值为 0 。这里 x 、y 是一点的纵横坐标的地址,所有的横坐标的地址排在所有纵坐标之前。

Page 3: #include  #include

第十三章 文件 在前面的程序中,是把数据保存到内存变量里,数据的处理完全由程序控制。当程序运行结束后,所有变量被释放。 另外,一般程序都会有数据的输入 / 输出,如果输入 / 输出的数据量不大,则在程序运行时通过键盘输入可解决;当输入 / 输出量很大时,就不方便了。 文件就是解决上述问题的有效办法。把程序中使用的大量数据,通过编辑工具事先存储在磁盘文件中,得以长期保存。当程序运行时就从这个数据文件中读入,从而实现数据一次输入多次使用。 同样,当有大量数据输出时,可以将其输出到指定文件中,不受屏幕大小限制,且任何时候都可查看文件结果。一个程序的运行结果还可作为另外程序的输入。

Page 4: #include  #include

§ 13.1 C 文件概述文件:存储在外部介质上数据的集合 , 是操作系统数据管理的单位使用数据文件的目的1 、数据文件的改动不引起程序的改动——程序与数据分离2 、不同程序可以访问同一数据文件中的数据——数据共享3 、能长期保存程序运行的中间数据或结果数据

文件分类按存储介质:

普通文件:存储介质文件(磁盘、磁带等)设备文件:非存储介质(键盘、显示器、打印机等)

按数据的组织形式:文本文件: ASCII 文件,每个字节存放一个字符的 ASCII码

二进制文件:数据按其在内存中的存储形式原样存放

Page 5: #include  #include

文件类型指针

指针变量说明: FILE *fp;fp 是一个指向 FILE 类型结构体的指针变量;从而 fp 通过该结构体变量中的文件信息能够访问该文件;

用法:文件打开时,系统自动建立文件结构体,并把指向它的指针返回来,程序通过这个指针获得文件信息 , 访问文件

文件关闭后,它的文件结构体被释放

Page 6: #include  #include

§ 13.3 文件的打开与关闭 C 文件操作用库函数实现 , 包含在 stdio.h 文件使用方式 : 打开文件 --> 文件读 / 写 --> 关闭文件

系统自动打开和关闭三个标准文件:标准输入 ------ 键盘 stdin标准输出 ------ 显示器 stdout标准出错输出 ----- 显示器 stderr

打开文件 fopen函数调用: FILE *fp fp=fopen(char *name,char *mode)功能:按指定方式打开文件返值:正常打开,为指向文件结构体的指针;打开失败,为 NULL

要打开的文件名

使用文件方式

例 文件打开与测试 FILE *fp; fp=fopen(“aa.c”,“w”); if(fp==NULL) { printf(“File open error!\n”); exit(0); }

例 FILE *fp; fp= fopen (“c:\\fengyi\\bkc\\test.dat”,”r”); 例 FILE *fp; char *filename=“c:\\fengyi\\bkc\\test.dat” fp= fopen(filename,”r”);

“r+/rb+” ( 读写 )

“a/ab” ( 追加 )

“w/wb” ( 只写 )

“r/rb” ( 只读 )

“w+/wb+” ( 读写 )

“a+/ab+” ( 读写 )

为输入打开一个文本 / 二进制文件

为输出打开或建立一个文本 / 二进制文件

为读 / 写打开一个文本 / 二进制文件

为读 / 写建立一个文本 / 二进制文件

为读 / 写打开或建立一个文本 / 二进制文件

向文本 / 二进制文件尾追加数据

文件使用方式 含义

Page 7: #include  #include

文件关闭 fclose作用 : 使文件指针变量与文件“脱钩”,释放文件结构体和文件指针

函数调用: fclose(fp)

功能:关闭文件指针 fp 所指向的文件返值:正常关闭为 0; 出错时 , 非 0文件打开时返回的文件类型指针

磁盘文件

输出文件缓冲区

输入文件缓冲区

程序数据区a

缓冲文件系统:

fclose

不关闭文件可能会丢失数据

Page 8: #include  #include

§ 13.4 文件的读写函数字符 I/O 函数 : fputc 与 fgetc

fputc函数调用: fputc(ch, fp)功能:把一字节代码 ch 写入 fp 指向的文件中返值:正常,返回 ch; 出错,为 EOF

fgetc函数调用: ch=fgetc(fp)功能:从文件指针 fp 所指向的文件中读取一个字节代码返值:正常,返回读到的代码值 ; 读到文件尾或出错为 EOF

文件 I/O 与终端 I/O#define putchar( c ) fputc(c,stdout)#define getchar( ) fgetc(stdin)

Page 9: #include  #include

判断二进制文件是否结束 while(!feof(fp)) { c=fgetc(fp); …….. }

例 文件拷贝

例 从键盘输入字符,逐个 存到磁盘文件中,直到 输入‘ #“ 为止

例 读文本文件内容, 并显示

#include <stdio.h>main(){ FILE *fp; char ch,*filename=“out.txt”; if((fp=fopen(filename,”r"))==NULL) { printf("cannot open file\n"); exit(0); } while((ch=fgetc(fp))!=EOF) putchar(ch); fclose(fp);}

feof函数原型: int feof(FILE *fp)功能:判断文件是否结束返值:文件结束,返回真(非 0 );文件未结束,返回 0

#include <stdio.h>main(){ FILE *fp; char ch,*filename=“out.txt”; if((fp=fopen(filename,"w"))==NULL) { printf("cannot open file\n");

exit(0); } printf("Please input string:"); ch=getchar(); while(ch!='#') { fputc(ch,fp); putchar(ch); ch=getchar(); } fclose(fp);}

将字符 ch 存入 fp 所指的文件中

将字符 ch 显示的屏幕上

获得一个字符存入 ch 中

#include <stdio.h>main(){ FILE *in, *out; char ch,infile[10],outfile[10]; scanf("%s",infile); scanf("%s",outfile); if ((in = fopen(infile, "r"))== NULL) { printf("Cannot open infile.\n"); exit(0); } if ((out = fopen(outfile, "w"))== NULL) { printf("Cannot open outfile.\n"); exit(0); } while (!feof(in)) fputc(fgetc(in), out); fclose(in); fclose(out);}

Page 10: #include  #include

数据块 I/O:fread 与 fwrite函数调用:

fread(buffer, size, count, *fp)fwrite(buffer, size, count, *fp)

功能:读 / 写数据块返值:成功时返回读 / 写的块数;出错或到文件尾返回 0说明:

buffer: 指向要输入 / 输出数据块的首地址的指针size: 每个要读 / 写的数据块的大小(字节数)count: 要读 / 写的数据块的个数fp: 要读 / 写的文件指针(对文件指针 fp 所指的文件进行读写

操作)。fread 与 fwrite 一般用于二进制文件的输入 / 输出

Page 11: #include  #include

例 float f[2]; FILE *fp; fp=fopen(“aa.dat”,“rb”); fread(f,4,2,fp);

for(i=0;i<2;i++) fread(&f[i],4,1,fp);

例 struct student { int num; char name[20]; char sex; int age; float score[3]; }stud[10]; for(i=0;i<10;i++) fread(&stud[i],sizeof(struct student),1,fp);

Page 12: #include  #include

例 从键盘输入 4 个学生数据,把他们转存到磁盘文件中去#include <stdio.h>#define SIZE 2struct student_type{ char name[10]; int num; int age; char addr[15];}stud[SIZE];main(){ 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(); display();}

void save(){ FILE *fp; int i; if((fp=fopen("d:\\fengyi\\exe\\stu_dat","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)

printf("file write error\n"); fclose(fp);}

void display(){ FILE *fp; int i; if((fp=fopen("d:\\fengyi\\exe\\stu_dat","rb"))==NULL) { printf("cannot open file\n");

return; } for(i=0;i<SIZE;i++) { fread(&stud[i],sizeof(struct student_type),1,fp); printf("%-10s %4d %4d %-15s\n",stud[i].name, stud[i].num,stud[i].age,stud[i].addr); } fclose(fp);}

Page 13: #include  #include

格式化 I/O:fprintf 与 fscanf函数调用:

fprintf(fp, format[,argument,…])fscanf(fp, format[,address,…])

功能:按格式对文件进行 I/O 操作返值:成功 , 返回 I/O 的个数 ; 出错或文件尾 , 返回 EOF

例 fprintf(fp,“%d,%6.2f”,i,t); // 将 i 和 t 按 %d,%6.2f 格式输出到 fp 文件 fscanf(fp,“%d,%f”,&i,&t); // 若文件中有 3,4.5 , 则将 3 送入 i, 4.5 送入 t

Page 14: #include  #include

字符串 I/O: fgets 与 fputs函数调用: fgets(s, n, fp)

fputs(s, fp)功能:从 fp 指向的文件读 / 写一个字符串返值:

fgets 正常时返回读取字符串的首地址;出错或文件尾,返回 NULL

fputs 正常时返回写入的最后一个字符;出错为 EOF

fgets 从 fp 所指文件读 n-1 个字符送入 s指向的内存区 ,并在最后加一个‘ \0’(若读入 n-1 个字符前遇换行符或文件尾( EOF )即结束 )

fputs 把 s指向的字符串写入 fp指向的文件

Page 15: #include  #include

§ 13.5 文件的定位几个概念

文件位置指针 ----- 指向当前读写位置的指针读写方式

顺序读写:位置指针按字节位置顺序移动,叫 ~随机读写:位置指针按需要移动到任意位置,叫 ~

rewind 函数函数调用: rewind(fp)功能:重置文件位置指针到文件开头返值:无

例 对一个磁盘文件进行显示和复制两次操作

#include <stdio.h>main(){ FILE *fp1,*fp2; fp1=fopen("d:\\fengyi\\bkc\\ch12_4.c","r"); fp2=fopen("d:\\fengyi\\bkc\\ch12_41.c","w"); while(!feof(fp1)) putchar(fgetc(fp1)); rewind(fp1); while(!feof(fp1)) fputc(fgetc(fp1),fp2); fclose(fp1); fclose(fp2);}

Page 16: #include  #include

fseek 函数函数调用: fseek(fp, offset, whence)功能:改变文件位置指针的位置返值:成功,返回 0 ;失败,返回非 0 值

文件指针位移量(以起始点为基点 , 移动的字节数 )>0 向后移动<0 向前移动

起始点文件开始 SEEK_SET 0文件当前位置 SEEK_CUR 1文件末尾 SEEK_END 2

例 fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2);

ftell 函数函数调用: ftell(fp)功能:返回位置指针当前位置 ( 用相对文件开头的位移量表示 )

返值:成功,返回当前位置指针位置;失败,返回 -1L ,

例 磁盘文件上有 3 个学生数据,要求读入第 1 , 3 学生数据并显示

main(){ int i; FILE *fp; if((fp=fopen("studat","rb"))==NULL) { printf("can't open file\n");exit(0); } for(i=0;i<3;i+=2) { fseek(fp,i*sizeof(struct student_type),0); fread(&stud[i],sizeof(struct student_type),1,fp); printf("%s %d %d %s\n", stud[i].name,stud[i].num,stud[i].age,stud[i].addr); } fclose(fp);}

#include <stdio.h>struct student_type{ int num; char name[10]; int age; char addr[15];}stud[3];

Page 17: #include  #include

§ 13.6 出错的检测ferror 函数

函数调用: ferror(fp)功能:测试文件是否出现错误返值:未出错, 0 ;出错,非 0说明

每次调用文件输入输出函数,均产生一个新的 ferror 函数值,所以应及时测试

fopen 打开文件时, ferror 函数初值自动置为 0

Page 18: #include  #include

clearerr 函数函数调用: clearerr(fp)功能:使文件错误标志置为 0返值:无说明:出错后,错误标志一直保留,直到对同一文件调 clearerr(fp) 或 rewind 或任何其它一个输入输出函数

例 ferror() 与 clearerr() 举例

#include <stdio.h>int main(void){ FILE *stream; stream = fopen("DUMMY.FIL", "w"); getc(stream); if (ferror(stream)) { printf("Error reading from DUMMY.FIL\n"); clearerr(stream); } if(!ferror(stream)) printf("Error indicator cleared!"); fclose(stream); return 0;}

Page 19: #include  #include

文件例题

Page 20: #include  #include

#include <stdio.h>

main()

{ FILE *fp1,*fp2,*fp3;

char ch;

fp1=fopen("a.txt","r");

fp2=fopen("b.txt","r"); // 以只读方式打开文件 a 和 b

fp3=fopen("c.txt","w"); // 以写方式打开文件 c

while((ch=fgetc(fp1))!=EOF)

fputc(ch,fp3);

while((ch=fgetc(fp2))!=EOF)

fputc(ch,fp3);

fclose(fp1);

fclose(fp2); fclose(fp3);

}

1. 有两个磁盘文件“ A” 和“ B”,各存放一行字母,今要求把这两个文件中的信息合并输出到一个新文件“ C”中去。

Page 21: #include  #include

#include <stdio.h>

#define N 5

struct student

{ char num[9];

char name[20];

float score[3];

float average;

};

2. 有 5 名学生,每名学生有 3 门课的成绩,从键盘输入以下数据(包括学生号 , 姓名 , 三门课成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“ stud” 中

Page 22: #include  #include

main( )

{ int i,j;

struct student stu[N];

FILE *fp;

fp=fopen("stud.txt","a+");

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

{printf(" 请输入第 %d 个学生的信息: \n",i+1);

scanf("%s%s",stu[i].num,stu[i].name);

stu[i].average=0;

for(j=0;j<3;j++)

{scanf("%f",&stu[i].score[j]);

stu[i].average=stu[i].average+ stu[i].score[j] /3; }

}

Page 23: #include  #include

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

{fprintf(fp,"%s %s",stu[i].num,stu[i].name);

for(j=0;j<3;j++)

fprintf(fp,"%4.0f", stu[i].score[j]);

fprintf(fp,"%4.0f\n", stu[i].average);

}

}

Page 24: #include  #include

# include <stdio.h>

main (int argc,char * argv[ ])

{FILE * f1, * f2;

char ch;

if (argc<3 )

{ printf (“ 参数个数不对 !\n"); exit (0);}

if (((f1 =fopen (argv [1],"r")) == NULL)||((f2 =fopen (argv [2],"r")) == NULL))

{ printf (“ 不能打开文件 !\n"); exit (0); }

while (!feof(f1)) fputc (fgetc (f1), (f2));

fclose (f1); fclose (f2);

} }

3. 以下程序将磁盘中的一个文件复制到另一个文件中。两个文件名在命令行给出,将程序补充完整。

Page 25: #include  #include

#include <stdio.h>

int fun(char *source, char *target)

{ FILE *fs,*ft; char ch;

if((fs=fopen(source,"r"))==NULL)

return 0; /* 打开源文件 */

if((ft=fopen(target, "w"))==NULL)

return 0; /* 打开目标文件 */

4.给定程序的功能是:调用函数 fun将指定源文件中的内容复制到指定的目标文件中,复制成功时函数返回值为 1 ,失败时返回0 。在复制的过程中,把复制的内容输出到终端屏幕。主函数中源文件名放在变量 sfname中,目标文件名放在变量 tfname 中。

Page 26: #include  #include

printf("\nThe data in file :\n");

ch=fgetc(fs); /* 在源文件中取一个字符 */

while(!feof(fs)) /* 是否到文件尾? */

{ putchar( ch ); /* 把从文件中读到的字符显示到屏幕上 */

fputc(ch,ft); /* 把字符 ch 存到目标文件中 */

ch=fgetc(fs); /* 在源文件中取一个字符 */

}

fclose(fs); fclose(ft);

printf("\n\n");

return 1;

}

Page 27: #include  #include

main( )

{ char sfname[20] ="d:\\myfile1.txt“;

char tfname[20]="d:\\myfile2.txt";

FILE *myf; int i; char c;

myf=fopen(sfname,"w");

for(i=1;i<30;i++) /*往文件 sfname 中写字符并显示到屏幕上 */

{c='A'+rand( )%25;

fprintf(myf,"%c",c);

printf("%c",c); }

fclose(myf);printf("\n\n");

if (fun(sfname, tfname)) printf("Succeed!");

else printf("Fail!");

}

调用函数 fun 进行文件内容复制

Page 28: #include  #include

5. 输入若干个学生的姓名、学号、数学、英语、计算机成绩到文件中 student.dat 。

#include <stdio.h>

main ( )

{ FILE *fp; char name[8],numb[8]; int m,e,c,n,i;

scanf(“%d”,&n); fp=fopen(“student.dat”,“w”);

for(i=1;i<=n;i++){

scanf(“%s%s%d%d%d”,name,numb,&m,&e,&c);

fprintf(fp,“%s%s%d%d%d\n”,name,numb,m,e,c);

}

fclose(fp);

}