SlideShare une entreprise Scribd logo
1  sur  18
第十章  文件 ,[object Object],[object Object],使用数据文件的目的 1 、数据文件的改动不引起程序的改动—— 程序与数据分离 2 、不同程序可以访问同一数据文件中的数据—— 数据共享 3 、能 长期保存 程序运行的中间数据或结果数据 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
文本文件特点 : 存储量大、速度慢、便于对字符操作 二进制文件特点 : 存储量小、速度快、便于存放中间结果 如  int 型数 10000 0010011100010000 内存存储形式 0010011100010000 二进制形式 0011000100110000001100000011000000110000 ASCII 形式
[object Object],[object Object],[object Object],磁盘文件 输出文件缓冲区 输入文件缓冲区 程序数据区 a 缓冲文件系统: 缓冲区 指令区 程序 用户数据区 磁盘 非缓冲文件系统:
[object Object],[object Object],[object Object],[object Object],[object Object],typedef  struct {  int  _fd;  // 文件号 int  _cleft;  // 缓冲区中剩下的字符数 int  _mode;  // 文件操作方式 char  *_next;  // 文件当前读写位置 char  *_buff;  // 文件缓冲区位置 }FILE;
[object Object],[object Object],[object Object],[object Object],[object Object],文件名 文件使用 方式 文件类型指针 C 程序 操作系统 磁盘
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],要打开的文件名 使用文件方式 例 文件打开与测试  FILE  *fp; fp=fopen(“aa.c”,“w”); if( fp== NULL ) {  printf(“File open error!”); exit(0); } 例  FILE  *fp; fp= fopen (“ c:fengyibkctest.dat ”,”r”);   例  FILE  *fp; char  *filename=“ c:fengyibkctest.dat ” fp= fopen(filename,”r”);   “ r+/rb+” ( 读写 ) “ a/ab” ( 追加 ) “ w/wb” ( 只写 ) “ r/rb” ( 只读 ) “ w+/wb+” ( 读写 ) “ a+/ab+” ( 读写 ) 为 输入 打开一个文本 / 二进制文件 为 输出 打开或建立一个文本 / 二进制文件 为读 / 写打开一个文本 / 二进制文件 为读 / 写建立一个文本 / 二进制文件 为读 / 写打开或建立一个文本 / 二进制文件 向文本 / 二进制文件尾 追加 数据 文件使用方式 含义
[object Object],[object Object],[object Object],[object Object],[object Object],文件打开时返回的文件类型指针 不关闭文件可能会 丢失数据 磁盘文件 输出文件缓冲区 输入文件缓冲区 程序数据区 a 缓冲文件系统: fclose
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],文件 I/O 与终端 I/O #define  putc(ch,fp)  fputc(ch,fp) #define  getc(fp)  fgetc(fp) #define  putchar( c )  fputc(c,stdout) #define  getchar( )  fgetc(stdin)
判断 二进制 文件是否结束 while(! feof (fp)) {  c=fgetc(fp); …… .. } 例  从键盘输入字符,逐个 存到磁盘文件中,直到 输入‘ #“ 为止 #include <stdio.h> main() {  FILE *fp; char ch,*filename=“out.txt”; if((fp=fopen(filename,&quot;w&quot;))==NULL) {  printf(&quot;cannot open file&quot;); exit(0); } printf(&quot;Please input string:&quot;); ch=getchar(); while(ch!='#') {  fputc(ch,fp); putchar(ch); ch=getchar(); } fclose(fp); } 例  读文本文件内容, 并显示 #include <stdio.h> main() {  FILE *fp; char ch,*filename=“out.txt”; if((fp=fopen(filename,”r&quot;))==NULL) {  printf(&quot;cannot open file&quot;); exit(0); } while(( ch=fgetc(fp) )!= EOF ) putchar(ch); fclose(fp); } 判断文本文件是否结束 ,[object Object],[object Object],[object Object],[object Object],#include <stdio.h> main() {  FILE *in, *out; char ch,infile[10],outfile[10]; scanf(&quot;%s&quot;,infile); scanf(&quot;%s&quot;,outfile); if ((in = fopen(infile, &quot;r&quot;))== NULL) { printf(&quot;Cannot open infile.&quot;); exit(0); } if  ((out = fopen(outfile, &quot;w&quot;))== NULL ) { printf(&quot;Cannot open outfile.&quot;); exit(0); } while (!feof(in)) fputc(fgetc(in), out); fclose(in);   fclose(out); } 例  文件拷贝
[object Object],[object Object],size_t  fread(void  *buffer,size_t  size, size_t  count,FILE  *fp) size_t  fwrite(void  *buffer,size_t  size, size_t  count,FILE  *fp) ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
例  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);
例  从键盘输入 4 个学生数据,把他们转存到磁盘文件中去 #include <stdio.h> #define SIZE 2 struct student_type {  char name[10]; int num; int age; char addr[15]; }stud[SIZE]; main() { int i; for(i=0;i<SIZE;i++) scanf(&quot;%s%d%d%s&quot;,stud[i].name,&stud[i].num,   &stud[i].age,stud[i].addr); save(); display(); } void save() {  FILE *fp; int  i; if(( fp=fopen(&quot;d:fengyiexestu_dat&quot;,&quot;wb&quot;))==NULL ) {  printf(&quot;cannot open file&quot;);   return; } for(i=0;i<SIZE;i++) if (fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1 )   printf(&quot;file write error&quot;); fclose(fp); } void display() {  FILE *fp; int  i; if(( fp=fopen(&quot;d:fengyiexestu_dat&quot;,&quot;rb&quot;))==NULL ) {  printf(&quot;cannot open file&quot;);   return; } for(i=0;i<SIZE;i++) {  fread(&stud[i],sizeof(struct student_type),1,fp); printf(&quot;%-10s %4d %4d %-15s&quot;,stud[i].name, stud[i].num,stud[i].age,stud[i].addr); } fclose(fp); }
[object Object],[object Object],int  fprintf(FILE  *fp,const char  *format[,argument,…]) int  fscanf(FILE  *fp,const char  *format[,address,…]) ,[object Object],[object Object],例  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 例  从键盘按格式输入数据存到磁盘文件中去 #include <stdio.h> main() { char s[80],c[80]; int a,b; FILE *fp; if ((fp=fopen(&quot;test&quot;,&quot;w&quot;))==NULL) {  puts(&quot;can't open file&quot;);  exit() ;  } fscanf(stdin,&quot;%s%d&quot;,s,&a) ;/*read from keaboard*/ fprintf(fp,&quot;%s  %d&quot;,s,a) ;/*write to file*/ fclose(fp); if(( fp=fopen(&quot;test&quot;,&quot;r&quot;))==NULL ) {  puts(&quot;can't open file&quot;); exit();  } fscanf(fp,&quot;%s%d&quot;,c,&b); /*read from file*/ fprintf(stdout,&quot;%s %d&quot;,c,b); /*print to screen*/ fclose(fp); }
[object Object],[object Object],char  *fgets(char  *s,int n,FILE  *fp) int  fputs(char  *s,FILE  *fp) ,[object Object],[object Object],[object Object],[object Object],例  从键盘读入字符串存入文件,再从文件读回显示 fgets 从 fp 所指文件读 n-1 个字符送入 s 指向的内存区 , 并在最后加一个‘ ’ ( 若读入 n-1 个字符前遇换行符或文件尾( EOF )即结束 ) fputs 把 s 指向的字符串写入 fp 指向的文件 #include<stdio.h> main() {  FILE  *fp; char  string[81]; if(( fp=fopen(&quot;file.txt&quot;,&quot;w&quot;))==NULL ) {  printf(&quot;cann't open file&quot;);exit(0); } while(strlen(gets(string))>0) {  fputs(string,fp); fputs(&quot;&quot;,fp); } fclose(fp); if(( fp=fopen(&quot;file.txt&quot;,&quot;r&quot;))==NULL ) {  printf(&quot;cann't open file&quot;);exit(0); } while( fgets(string,81,fp)!=NULL ) fputs(string,stdout); fclose(fp); }
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],例  对一个磁盘文件进行显示和复制两次操作 #include <stdio.h> main() {  FILE *fp1,*fp2; fp1= fopen(&quot;d:fengyibkcch12_4.c&quot;,&quot;r&quot;); fp2 =fopen(&quot;d:fengyibkcch12_41.c&quot;,&quot;w&quot;); while (!feof(fp1 ))  putchar(getc(fp1)); rewind(fp1); while(!feof(fp1))  putc(getc(fp1),fp2); fclose(fp1); fclose(fp2); }
[object Object],[object Object],[object Object],[object Object],文件指针 位移量(以起始点为基点 , 移动的字节数 ) >0   向后移动 <0   向前移动 起始点 文件开始   SEEK_SET  0 文件当前位置   SEEK_CUR  1 文件末尾   SEEK_END  2 例  fseek(fp,100L,0); fseek(fp,50L,1); fseek(fp,-10L,2);  ,[object Object],[object Object],[object Object],[object Object],例  磁盘文件上有 3 个学生数据,要求读入第 1 , 3 学生数据并显示 #include&quot;stdio.h&quot; main() { FILE *fp; char filename[80]; long length; gets(filename); fp=fopen(filename,&quot;rb&quot;); if(fp==NULL) printf(&quot;file not found!&quot;); else {  fseek(fp,0L,SEEK_END); length= ftell(fp); printf(&quot;Length of File is %1d bytes&quot;,length); fclose(fp); } } 例  求文件长度 (ch12_101.c) main() {  int i; FILE *fp; if ((fp=fopen(&quot;studat&quot;,&quot;rb&quot;))==NULL ) {  printf(&quot;can't open file&quot;);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(&quot;%s  %d  %d  %s&quot;, 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];
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],例  ferror() 与 clearerr() 举例 #include <stdio.h> int  main(void) {  FILE *stream; stream =  fopen(&quot;DUMMY.FIL&quot;, &quot;w&quot;); getc(stream); if ( ferror(stream )) {  printf(&quot;Error reading from DUMMY.FIL&quot;); clearerr(stream); } if (!ferror(stream )) printf(&quot;Error indicator cleared!&quot;); fclose(stream); return 0; }

Contenu connexe

En vedette (9)

aSia de monções
aSia de monçõesaSia de monções
aSia de monções
 
Parabéns Paty
Parabéns PatyParabéns Paty
Parabéns Paty
 
Ficha1 diogo almeida
Ficha1 diogo almeidaFicha1 diogo almeida
Ficha1 diogo almeida
 
Formatos de audio
Formatos de audio Formatos de audio
Formatos de audio
 
Deodoro da fonseca
Deodoro da fonseca Deodoro da fonseca
Deodoro da fonseca
 
Apresentação do blog
Apresentação do blogApresentação do blog
Apresentação do blog
 
3ª Part Revista
3ª Part Revista3ª Part Revista
3ª Part Revista
 
ICEX - Servicios para la Internacionalización 2014
ICEX - Servicios para la Internacionalización 2014ICEX - Servicios para la Internacionalización 2014
ICEX - Servicios para la Internacionalización 2014
 
Chimport 2014 Versão Portuguesa
Chimport 2014 Versão PortuguesaChimport 2014 Versão Portuguesa
Chimport 2014 Versão Portuguesa
 

Similaire à C语言

07 Structure, File.pdf
07 Structure, File.pdf07 Structure, File.pdf
07 Structure, File.pdfJTLai1
 
File api
File apiFile api
File apiTom Fan
 
Puppet安装测试
Puppet安装测试Puppet安装测试
Puppet安装测试Yiwei Ma
 
C语言benchmark覆盖信息收集总结4
C语言benchmark覆盖信息收集总结4C语言benchmark覆盖信息收集总结4
C语言benchmark覆盖信息收集总结4Tao He
 
Device Driver - Chapter 3字元驅動程式
Device Driver - Chapter 3字元驅動程式Device Driver - Chapter 3字元驅動程式
Device Driver - Chapter 3字元驅動程式ZongYing Lyu
 
[系列活動] 手把手教你R語言資料分析實務
[系列活動] 手把手教你R語言資料分析實務[系列活動] 手把手教你R語言資料分析實務
[系列活動] 手把手教你R語言資料分析實務台灣資料科學年會
 
Practical data analysis in R: from data collection to data insight
Practical data analysis in R: from data collection to data insight Practical data analysis in R: from data collection to data insight
Practical data analysis in R: from data collection to data insight Chun-Min Chang
 
Practical Data Analysis in R
Practical Data Analysis in RPractical Data Analysis in R
Practical Data Analysis in RChun-Ming Chang
 
Excelize云原生时代国产电子表格文档基础库的开源之路
Excelize云原生时代国产电子表格文档基础库的开源之路Excelize云原生时代国产电子表格文档基础库的开源之路
Excelize云原生时代国产电子表格文档基础库的开源之路Ri Xu
 
1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學Sita Liu
 
Javascript Training
Javascript TrainingJavascript Training
Javascript Trainingbeijing.josh
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIWeizhong Yang
 
Chapter 6 point (c)
Chapter 6 point (c)Chapter 6 point (c)
Chapter 6 point (c)hhliu
 
Linux常用命令与工具简介
Linux常用命令与工具简介Linux常用命令与工具简介
Linux常用命令与工具简介weihe
 
Php for fe
Php for fePhp for fe
Php for fejay li
 

Similaire à C语言 (20)

15 1 스트림
15 1 스트림15 1 스트림
15 1 스트림
 
07 Structure, File.pdf
07 Structure, File.pdf07 Structure, File.pdf
07 Structure, File.pdf
 
File api
File apiFile api
File api
 
Php
PhpPhp
Php
 
Puppet安装测试
Puppet安装测试Puppet安装测试
Puppet安装测试
 
Ch7 教學
Ch7 教學Ch7 教學
Ch7 教學
 
C语言benchmark覆盖信息收集总结4
C语言benchmark覆盖信息收集总结4C语言benchmark覆盖信息收集总结4
C语言benchmark覆盖信息收集总结4
 
Device Driver - Chapter 3字元驅動程式
Device Driver - Chapter 3字元驅動程式Device Driver - Chapter 3字元驅動程式
Device Driver - Chapter 3字元驅動程式
 
[系列活動] 手把手教你R語言資料分析實務
[系列活動] 手把手教你R語言資料分析實務[系列活動] 手把手教你R語言資料分析實務
[系列活動] 手把手教你R語言資料分析實務
 
Practical data analysis in R: from data collection to data insight
Practical data analysis in R: from data collection to data insight Practical data analysis in R: from data collection to data insight
Practical data analysis in R: from data collection to data insight
 
Practical Data Analysis in R
Practical Data Analysis in RPractical Data Analysis in R
Practical Data Analysis in R
 
Excelize云原生时代国产电子表格文档基础库的开源之路
Excelize云原生时代国产电子表格文档基础库的开源之路Excelize云原生时代国产电子表格文档基础库的开源之路
Excelize云原生时代国产电子表格文档基础库的开源之路
 
1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
 
Javascript Training
Javascript TrainingJavascript Training
Javascript Training
 
Mac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio APIMac OS X 與 iOS 的 Audio API
Mac OS X 與 iOS 的 Audio API
 
ios分享
ios分享ios分享
ios分享
 
Chapter 6 point (c)
Chapter 6 point (c)Chapter 6 point (c)
Chapter 6 point (c)
 
Linux常用命令与工具简介
Linux常用命令与工具简介Linux常用命令与工具简介
Linux常用命令与工具简介
 
Php for fe
Php for fePhp for fe
Php for fe
 
Golang
GolangGolang
Golang
 

C语言

  • 1.
  • 2. 文本文件特点 : 存储量大、速度慢、便于对字符操作 二进制文件特点 : 存储量小、速度快、便于存放中间结果 如 int 型数 10000 0010011100010000 内存存储形式 0010011100010000 二进制形式 0011000100110000001100000011000000110000 ASCII 形式
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11. 例 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);
  • 12. 例 从键盘输入 4 个学生数据,把他们转存到磁盘文件中去 #include <stdio.h> #define SIZE 2 struct student_type { char name[10]; int num; int age; char addr[15]; }stud[SIZE]; main() { int i; for(i=0;i<SIZE;i++) scanf(&quot;%s%d%d%s&quot;,stud[i].name,&stud[i].num, &stud[i].age,stud[i].addr); save(); display(); } void save() { FILE *fp; int i; if(( fp=fopen(&quot;d:fengyiexestu_dat&quot;,&quot;wb&quot;))==NULL ) { printf(&quot;cannot open file&quot;); return; } for(i=0;i<SIZE;i++) if (fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1 ) printf(&quot;file write error&quot;); fclose(fp); } void display() { FILE *fp; int i; if(( fp=fopen(&quot;d:fengyiexestu_dat&quot;,&quot;rb&quot;))==NULL ) { printf(&quot;cannot open file&quot;); return; } for(i=0;i<SIZE;i++) { fread(&stud[i],sizeof(struct student_type),1,fp); printf(&quot;%-10s %4d %4d %-15s&quot;,stud[i].name, stud[i].num,stud[i].age,stud[i].addr); } fclose(fp); }
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

Notes de l'éditeur

  1. 因为fclose先把缓冲区数据输出到磁盘文件,然后才释放文件指针
  2. 1.若文件在当前目录下:fp=fopen(\"aa.txt\",\"r\");2.若文件不在当前目录下:fp=fopen(\"d:\\\\fengyi\\\\bkc\\\\aa.txt\",\"r\");2.若从键盘输入带路径文件名:char infile[30];scanf(\"%s\",infile);fp=fopen(infile,\"r\");必须输入:d:\\fengyi\\bkc\\aa.txt
  3. 说明:输入时,要将ASCII码转换成二进制;输出时,要将二进制转换成ASCII码
  4. 第一个参数可以是:字符串常量、char数组名、char指针