Discuz教程网

C语言案例教程 - 第九章 文件

[复制链接]
authicon 09927306 发表于 2011-1-8 18:18:37 | 显示全部楼层 |阅读模式
第9章:文件
【例9-1】
将字符A、B、C和EOF写入A盘根目录下的文件ex9–1.txtdat中。


  1. #include <stdio.h>
  2.         FILE *fi;
  3.         main()
  4.           { char a='A',b='B',c='C';
  5.             if ((fi=fopen("a:\\ex9-1.txt","w"))==NULL)
  6.               { printf("cannot open file\n"); exit(1); }
  7.             fputc(a,fi);
  8.             fputc(b,fi);
  9.             fputc(c,fi);
  10.             fputc(0xff,fi);
  11.             fclose(fi);
  12.           }
复制代码


【例9-2】
从例9-1建立的文件ex9-1.txt中读出所有的字符并显示在屏幕上。


  1. #include<stdio.h>
  2.         FILE *fi;
  3.         main()
  4.           { char a;
  5.             int i;
  6.             if ((fi=fopen("a:\\ex9-1.txt","r"))==NULL)
  7.               { printf("cannot open file\n"); exit(1); }
  8.             ;
  9.             while ((a=fgetc(fi))!=EOF)
  10.               putchar(a);
  11.             fclose(fi);
  12.           }
复制代码


【例9-3】
将字符串"Turbo C","BASIC","FORTRUN","COBOL","PL-1"写入文件ex9-2.txt。


  1. #include <stdio.h>
  2.         FILE *fi;
  3.         main()
  4.           { char a[][9]={"Turbo C","BASIC","FORTRAN","COBOL","PL-1"};
  5.             int i;
  6.             if ((fi=fopen("a:\\ex9-2.txt","w"))==NULL)
  7.               { printf("Cannot open file\n");
  8.                 exit(1); }
  9.             for (i=0;i<=4;i++)
  10.                fputs(a[i],fi);
  11.             fclose(fi);
  12.           }
复制代码


【例9-4】在上例创建的ex9-2.txt文件的末尾追加3个字符串"C++"、"MS-C"和"Pascal"。


  1. #include <stdio.h>
  2.         FILE *fi;
  3.         main()
  4.           { char a[][8]={"C++\n","MS-C\n","Pascal\n"};
  5.             int i;
  6.             if ((fi=fopen("a:\\ex9-2.txt","a"))==NULL)
  7.               { printf("Cannot open file\n");
  8.                 exit(1); }
  9.             for (i=0;i<=2;i++)
  10.               fputs(a[i],fi);
  11.             fclose(fi);
  12.           }
复制代码


【例9-5】
从由例9-3和例9-4建立的文本文件ex9–2.txt中读出各个字符串并将其中第0、2、4、6号字符串显示在屏幕上。


  1. #include <stdio.h>
  2.         FILE *fi;
  3.         main()
  4.           { char a[8][9];
  5.             int i;
  6.             if ((fi=fopen("a:\\ex9-2.txt","r"))==NULL)
  7.               { printf("Cannot open file\n");
  8.                 exit(1); }
  9.             for (i=0;i<=7;i++)
  10.               { fgets(a[i],10,fi);
  11.                   if (i%2==0)      /*从文件中读取字符串并 */
  12.                    printf("%s",a[i]); /* 显示第0、2、4、6号字符串 */
  13.                }
  14.             fclose(fi);
  15.           }
复制代码


【例9-6】
将下表数据写入文件ex9-3.txt。
公司

    类型

   重量

TOSHIBA

J-3100SGT


6.8 kg

NEC

PC-9801LS


8.8 kg

FUJITSU

FMTOWNS


11.0 kg

HITACHI

B16X


7.3 kg



  1. #include <stdio.h>
  2.         FILE *f;
  3.         main()
  4.           { char pc[][10]={"TOSHIBA","J-2100SGT","6.8kg","NEC","PC-9801LS",
  5.                            "8.8kg","FUJITSU","FMTOWNS","11.0kg"};
  6.             int i;
  7.             if ((f=fopen("a:\\ex9-3.txt","w"))==NULL)
  8.               { printf("Cannot open file");
  9.                 exit(1); }
  10.                 for (i=0;i<=6;i+=3)
  11.                   fprintf(f,"%s %s %s ",pc[i],pc[i+1],pc[i+2]);
  12.                 fclose(f);
  13.               }
复制代码

【例9-7】
读出例9-6所建立文件ex9-3.txt中的数据。


  1. #include <stdio.h>
  2.         main()
  3.           { FILE *f;
  4.             char pc[9][10];
  5.             int i;
  6.             if ((f=fopen("a:\\ex9-3.txt","r"))==NULL)
  7.               { printf("Cannot open file");
  8.                 exit(1); }
  9.              for (i=0;i<=6;i+=3)
  10.                 fscanf(f,"%s%s%s",pc[i],pc[i+1],pc[i+2]);
  11.              fclose(f);
  12.              for (i=0;i<=6;i+=3)
  13.                printf("FACT %10s TYPE %10s WEIG %7s\n",pc[i],pc[i+1],pc[i+2]);
  14.          }
复制代码

程序输出结果如下:

FACT
TOSHIBA
TYPE
J-3100SGT WEIG
6.8 kg

FACT
NEC
TYPE
PC-9801LS WEIG
8.8 kg

FACT
FUJITSU
TYPE
FMTOWNS WEIG 11.0 kg
【例9-8】
从键盘输入100个整数,将它们存放在int型数组sam中,将该数组作为一个数据块写入文件ex9-4.dat中。
用“wb”方式打开文件,从键盘输入100个整数存放在数组sam中,然后用fwrite()将sam作为一个数据块写入文件ex9–4.dat。


  1. #include <stdio.h>
  2.         #include <stdlib.h>
  3.         FILE *fp;
  4.         main()
  5.           { int sam[100],i;
  6.             if (!(fp=fopen("a:\\ex9-4.dat","wb")))
  7.               { printf("Cannot open file\n");
  8.                 exit(1); }
  9.             for (i=0;i<100;i++)
  10.                scanf("%d",&sam[i]);
  11.             fwrite(sam,sizeof(sam),1,fp);
  12.             fclose(fp);
  13.           }
复制代码


【例9-9】
从例9-8建立的二进制文件ex9-4.dat中读取10个浮点数存入数组b,并在屏幕上显示这10个数。
以“rb”方式打开文件,用fread()读入含10个整数的数据块存入数组b,再由printf()的格式控制将数组b中的二进制数转换成十进制数输出。


  1. #include <stdio.h>
  2.         FILE *fp;
  3.         main()
  4.           { int b[10],i;
  5.             if (!(fp=fopen("a:\\ex9-4.dat","rb")))
  6.               { printf("Cannot open file\n");
  7.                 exit(1); }
  8.             if (fread(b,sizeof(int),10,fp)!=10)      /*读取的数据块不足*/
  9.               { if (!feof(fp)) printf("premature end of file\n");  
  10. /*已到文件末尾*/
  11.                 else printf("file read error\n");             /*读取过程中出错*/
  12.                 exit(1);
  13.               }
  14.             fclose(fp);
  15.             for(i=0;i<10;i++)
  16.               printf("%d",b[i]);
  17.           }
复制代码

【例9-10】
文件拷贝。用命令行方式将一个二进制文件的内容拷贝到另一个文件中。命令行共3个参数,第一个参数为可执行程序名,第二、三个参数分别为需要拷贝的源文件和目的文件,它们将依次存放在argv[0]、argv[1]和argv[2]中。
用“rb”方式打开保存在argv[1]中的源文件名,用“wb”保存在argv[2]中的目的文件名,然后用fgetc()依次读出源文件中的每一个字符,用fputc()将该字符写入目的文件,这一过程直到feof()取非0值为止。程序如下:


  1. #include <stdio.h>
  2.         FILE *in,*out;
  3.         main(int argc,char *argv[])
  4.           { char ch;
  5.             if (argc!=3)
  6.               { puts("You forget to enter a file name\n");
  7.                 exit(0); }
  8.             if ((in=fopen(argv[1],"rb"))==NULL)
  9.               { puts("Cannot open file\n");
  10.                 exit(0); }
  11.             if ((out=fopen(argv[2],"wb"))==NULL)
  12.               { puts("Cannot open file\n");
  13.                 exit(0); }
  14.             while(!feof(in))
  15.               { ch=fgetc(in);                /*读取一个字节*/
  16.                 if (ferror(in))           /*读错*/
  17.                   { printf("read error\n");
  18.                     clearerr(in);             /*清除出错标志*/
  19.                     exit(1);}
  20.                 else { fputc(ch,out);         /*写入一个字节*/
  21.                        if (ferror(out))    /*写错*/
  22.                          { printf("write error\n");
  23.                            clearerr(out);      /*清除出错标志*/
  24.                            exit(1); }
  25.                      }
  26.               }
  27.             fclose(in);fclose(out);
  28.           }
复制代码


【例9-11】
利用ftell()和fseek()确定二进制文件的长度(字节数)和记录数。
假设一个二进制文件k.dat的每个记录含有若干字段,组织成一个struct st型数据,该文件用指针fp打开后,可以先用fseek()将文件指针定位到文件尾,用fteell()就可以获得该文件的长度,用文件长度与每个记录长度相除,就可以得到该文件所包含的记录数。


  1. FILE *fp;
  2.     struct st
  3.       { …… };
  4.     int n,k;
  5.     fp=fopen("k.dat","rb+");
  6.     fseek(fp,0,SEEK_END);          /*文件指针移到文件尾*/
  7.     n=ftell(fp);               /*文件长度字节数*/
  8.     k=n/sizeof(struct st);     /*文件记录数*/
复制代码


【例9-12】
建立一个考生档案顺序文件,包括准考证号、姓名、学校、数学、语文、外语、物理、化学、政治、生物和总分,并能根据准考证号进行顺序查询,通知该考生的考试成绩。
顺序文件是顺序存取的文件,它的各记录的长度既可以相等也可以不等,既可以是文本文件也可以是二进制文件。下面分别用文本文件和二进制文件的形式实现题目的要求。
(1) 在创建顺序文本文件时,最好配对使用文件读写函数,以保证输入或输出的格式一致。对只含文字数据的文本文件,可以配对使用fgetc()和fputc()、fgets()和fputs();对既有文字信息,又有数值信息的文本文件,通常配对使用fscanf()和fprintf()。下面的程序用来建立一个记录长度不等的顺序文本文件score.txt,每次循环写入一条记录。


  1. #include <stdio.h>
  2.         FILE *fp;
  3.         main()
  4.           { int i,score[8];
  5.             char num[8],name[11],school[11];
  6.             if ((fp=fopen("a:\\score.txt","w"))==NULL)
  7.               { printf("can not open file.\n");
  8.                 exit(1); }
  9.             while(1)                                   /* 输入考生信息 */
  10.               { printf("input test number(0000000 to terminate):");
  11.                 gets(num);
  12.                 if (strcmp(num,"0000000")==0)  break;      /*输入0000000时结束*/
  13.                 printf("input name:");
  14.                 gets(name);
  15.                 printf("input school:");
  16.                 gets(school);
  17.                 printf("input Chinese:");
  18.                 scanf("%d",&score[0]);
  19.                 printf("input Mathematics:");
  20.                 scanf("%d",&score[1]);
  21.                 printf("input Foreign Language:");
  22.                 scanf("%d",&score[2]);
  23.                 printf("input Physics:");
  24.                 scanf("%d",&score[3]);
  25.                 printf("input Chemistry:");
  26.                 scanf("%d",&score[4]);
  27.                 printf("input Biology:");
  28.                 scanf("%d",&score[5]);
  29.                 printf("input Politics:");
  30.                 scanf("%d%*c",&score[6]);
  31.                 score[7]=0;
  32.                 for(i=0;i<7;i++)  /* 计算总分 */
  33.                   score[7]+=score[i];
  34.                 fprintf(fp,"%s %s %s %d %d %d %d %d %d %d %d ",num,name,school,
  35.                            score[0],score[1],score[2],score[3],score[4],
  36.                            score[5],score[6],score[7]);        /* 写入文件 */
  37.               }
  38.             fclose(fp);
  39.           }
复制代码


【例9-13】
学生考试成绩登录程序。要求登录学号和分数两个信息,其中,学号也用做记录的编号。
用结构类型组织学生信息,包括学号和分数。输入时不必按学号的顺序进行,只要输入学号和分数,程序自动将该记录写到文件相应的位置上。在进行文件指针定位时,要使用fseek()函数,而fseek()函数在对文本文件定位时容易出错,因此随机文件通常是二进制文件。
下面是建立随机文件score1.dat的程序。程序自动将输入的学号num作为文件的记录号j:j=num-1(因为1号学生应处于第0号记录)。


  1. #include <stdio.h>
  2.         FILE *fp;
  3.         struct student
  4.           { int num;
  5.             int score; } st;
  6.         main()
  7.           { int j;
  8.             if ((fp=fopen("a:\\score1.dat","wb"))==NULL)
  9.               { printf("can not open file.\n");
  10.                 exit(1); }
  11.             while(1)
  12.              { printf("input number(0 to terminate):"); /* 输入学号 */
  13.                scanf("%d",&st.num);
  14.                if(st.num==0)  break;
  15.                printf("input score:");              /* 输入分数 */
  16.                scanf("%d",&st.score);
  17.                j=st.num-1;                                /* 计算记录号 */
  18.                fseek(fp,(long)j*sizeof(st),0);          /* 对第j号记录定位 */
  19.                if(fwrite(&st,sizeof(struct student),1,fp)!=1) /*写入*/
  20.                   { puts("Write file error.\n");
  21.                     exit(1);
  22.                   }
  23.              }
  24.             fclose(fp);
  25.           }
复制代码





上一篇:C语言案例教程 - 第八章 复合数据类型
下一篇:据说是新浪php工程师的面试题(编程部分)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-7-2 18:19

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表