C语言成长学习题(十八)
86.新建名为d:\cwz\a1.txt的文本文件,调用fputc函数将输入的学生姓名,电话号码写到文件中,输入以#作为结束标志.
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void main (void) 5 { 6 char ch; 7 FILE *fp; 8 9 fp = fopen("d:\\cwz\\a1.txt", "w"); 10 if (fp == NULL) 11 { 12 printf("Can't open file!\n"); 13 exit(0); 14 } 15 ch = getchar(); 16 while (ch != '#') 17 { 18 fputc(ch, fp); 19 ch = getchar(); 20 } 21 fclose(fp); 22 }
87.调用fgetc函数,一次读取文件d:\cwz\a1.txt中的字符,并将它们显示在屏幕上.
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void main (void) 5 { 6 char ch; 7 FILE *fp; 8 9 fp = fopen("d:\\cwz\\a1.txt", "r"); 10 if (fp == NULL) 11 { 12 printf("Can't open file!\n"); 13 exit(0); 14 } 15 ch = fgetc(fp); 16 while (ch != EOF) 17 { 18 putchar(ch); 19 ch = fgetc(fp); 20 } 21 fclose(fp); 22 }
在C语言中,EOF的值为-1.由于文本文件中的字符均以ASCII代码形式存放,而ASCII代码没有-1值,因为只要不到文件尾,ch的值不会为-1,循环都将继续;一旦ch的值为-1,说明已读到文件尾,循环结束.
88.调用fputs函数在d:\cwz\a1.txt文件的尾部增写若干学生的姓名和电话号码,操作以输入空串作为结束.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 void main (void) 6 { 7 char a[80]; 8 FILE *fp; 9 10 fp = fopen("d:\\cwz\\a1.txt", "a"); 11 if (fp == NULL) 12 { 13 printf("Can't open file!\n"); 14 exit(0); 15 } 16 gets(a); 17 while (strcmp(a, "") != 0) 18 { 19 fputs(a, fp); 20 fputs("\n", fp); 21 gets(a); 22 } 23 fclose(fp); 24 }
89.调用fgets函数,读取d:\cwz\a1.txt文件中的学生信息,并将这些信息输出在屏幕上.
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void main (void) 5 { 6 char a[80]; 7 FILE *fp; 8 9 fp = fopen("d:\\cwz\\a1.txt", "r"); 10 if (fp == NULL) 11 { 12 printf("Can't open file!\n"); 13 exit(0); 14 } 15 16 fgets(a, 80, fp); 17 while (feof(fp) == 0) 18 { 19 printf("%s", a); 20 fgets(a, 80, fp); 21 } 22 fclose(fp); 23 }
fgets(a, 80, fp)的功能是从fp所指文件中,读入一行字符(最多79个)放入以a为地址的内存空间.
90.调用fwrite函数,将5名学生的姓名和学号写入二进制文件d:\cwz\c.dat.
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 struct student 5 { 6 char name[20]; 7 int num; 8 }; 9 10 void main (void) 11 { 12 struct student tel[5] = {{"Jia", 8888}, {"Yi", 7777}, {"Bin", 6666}, {"Ding", 5555}, {"Wu", 4444}}; 13 int i; 14 FILE *fp; 15 16 fp = fopen("d:\\cwz\\c.dat", "wb"); 17 if (fp == NULL) 18 { 19 printf("Can't open file!\n"); 20 exit(0); 21 } 22 for (i = 0; i < 5; i++) 23 { 24 fwrite(tel+i, sizeof(struct student), 1, fp); 25 } 26 27 fclose(fp); 28 }
由于操作对象是一个二进制文件,所以应按fopen("d:\\cwz\\c.dat", "wb")形式打开文件.
执行语句"fwrite(tel+i, sizeof(struct student), 1, fp);"后,从文件起始位置起,将数组tel中5个元素的有关数据一一写到文件中,其中tel+i,代表每个数据块所在的内存地址,用表达式sizeof(struct student)计算该数据块的字节数,数字1表示每次写1个数据块.
91.调用fread函数,按数据块方式从二进制文件d:\cwz\c.dat中读取数据,然后显示在终端屏幕上.
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 struct student 5 { 6 char name[20]; 7 int num; 8 }; 9 10 void main (void) 11 { 12 struct student a; 13 int i; 14 FILE *fp; 15 16 fp = fopen("d:\\cwz\\c.dat", "rb"); 17 if (fp == NULL) 18 { 19 printf("Can't open file!\n"); 20 exit(0); 21 } 22 for (i = 0; i < 5; i++) 23 { 24 fread(&a, sizeof(struct student), 1, fp); 25 printf("%s %d\n", a.name, a.num); 26 } 27 28 fclose(fp); 29 }
Mark:
在函数fread(&a, sizeof(struct student), 1, fp)中,第一个参数表示a的地址,第二个参数表示一次所读数据的字节数,第三个参数表示所读数据块数,第四个参数是文件指针.
fwrite 和 fread 函数一般用于二进制文件.
fseek函数: 移动位置指针到指定位置.SEEK_SET表示文件开始,SEEK_CUR表示文件当前位置,SEEK_END表示文件结尾.
ftell函数: 获得当前位置指针的位置.
rewind函数: 使位置指针回到文件的开头.