Hightlight
1. 文件操作通用基本格式
2. 文件操作读写操作
2.1 文件写操作
2.2 简单的文件读操作
2.3 e.g.
2.4 对文件批量处理练习---- fread/fwrite函数
3. 函数变长参数
4. 字符串转成int/float变量 ---atoi/atof 函数
5. sprintf和sscanf函数
1. 文件操作通用基本格式
-- 文件指针用来在程序中代表一个文件,类型是FILE*
-- fopen函数可以打开一个文件并且把文件对应的结构体地址作为返回值
--fclose函数可以关闭一个文件,他需要一个文件指针作为参数。文件关闭后文件指针应该被清除为NULL
1 #include <stdio.h> 2 3 int main() 4 { 5 FILE *p_file=NULL; 6 p_file=fopen("a.txt","w"); 7 if(p_file){ 8 fclose(p_file); 9 p_file=NULL; 10 } 11 return 0; 12 }
2. 文件操作读写操作
2.1 文件写操作
fputc函数可以把一个字符写进文件中 如果失败返回EOF
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 FILE * p_file=NULL; 7 p_file=fopen("a.txt","w"); 8 9 char str[]="hello world"; 10 int i=0; 11 12 13 if(p_file) 14 { 15 while(*(str+i)!=0){ 16 if(EOF== fputc(str[i],p_file)){//fputc可以吧一个字符写进文件中如果失败返回EOF 17 break; 18 } 19 i++; 20 } 21 fclose(p_file); 22 p_file=NULL; 23 } 24 return 0; 25 } ~
2.2 简单的文件读操作
fgutc函数可以把一个从文件里读取一个字符 如果失败返回EOF
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 FILE *p_file=NULL; 7 p_file=fopen("a.txt","r"); 8 char zi_fu=0; 9 if(p_file){ 10 while(zi_fu!=EOF) 11 { 12 zi_fu=fgetc(p_file); //fgetc函数用于从文件中读操作 13 if(zi_fu!=EOF) 14 printf("%c",zi_fu); 15 } 16 printf("\n"); 17 fclose(p_file); 18 p_file=NULL; 19 } 20 21 }
2.3 e.g
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 int main() 6 { 7 FILE *p_file_r=NULL; 8 FILE *p_file_w=NULL; 9 10 p_file_r=fopen("a.txt","r"); 11 char chr=‘0‘; 12 p_file_w=fopen("b.txt","w"); 13 14 if(p_file_r!=0&&p_file_w!=0){ 15 while(chr!=EOF){ 16 chr=fgetc(p_file_r); 17 if(chr!=EOF){ 18 if(p_file_w){ 19 if(EOF==fputc(chr,p_file_w)) 20 break; 21 } 22 } 23 } 24 } 25 fclose(p_file_r); 26 fclose(p_file_w); 27 p_file_r=NULL; 28 p_file_w=NULL; 29 30 return 0; 31 } ~
2.4 对文件批量处理练习---- fread/fwrite函数
----fread函数,返回成功写进的数字个数, fwrite函数,返回成功写进的数字个数。
----fwrite函数可以批量以2进制方式向文件中写入数据。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 FILE *p_file=NULL; 7 int values[3]={0}; 8 9 p_file=fopen("a.bin","rb"); 10 if(p_file){ 11 int num=fread(values, sizeof(int),3,p_file); // 12 13 //int num=fwrite(values,sizeof(int),3,p_file); 14 printf("%d words has been writen\n",num); 15 int i=0; 16 for(i=0;i<3;i++) 17 { 18 printf("%d\n",values[i]); 19 } 20 fclose(p_file); 21 p_file=NULL; 22 } 23 }
2.4 对文件批量处理练习---- rewind/fseek函数
----文件的位置指针用来记录下一次文件操作的位置。
----rewind函数可以吧文件的位置指针移动到文件开头
----fseek函数可以把文件指针移动到文件中的任何位置上
----ftell函数,可以告诉我们当前文件位置指针的信息。
-->SEEK_SET 表示文件开头,对应数字是0
-->SEEK_CUR 表示文件当前位置,对应数字是1
-->SEEK_END 表示文件结尾,对应数字是2
在fseek函数中可以用上面3个位置作为基准位置来描述文件中的任何一个位置并把它设置成文件位置指针的位置
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 FILE *p_file=NULL; 7 char zi_fu=0; 8 p_file=fopen("a.txt","r"); 9 10 if(p_file){ 11 fseek(p_file,6,SEEK_SET); //读到w.把位置指针移动到从文件头开始向后6个字节的位置 12 zi_fu=fgetc(p_file); 13 printf("%c",zi_fu); 14 15 fseek(p_file,-1,SEEK_END); //读到d. 把位置指针移动到从文件尾开始向前2个字节位置 16 zi_fu=fgetc(p_file); 17 printf("%c",zi_fu); 18 19 fseek(p_file,-3,SEEK_CUR); //读到r. //把位置指针移动到从文件位置指针当前位置向前3个字节的位置 20 zi_fu=fgetc(p_file); 21 printf("%c\n",zi_fu); 22 23 printf("the current file pointer is staying at: %ld\n",ftell(p_file)); 24 fclose(p_file); 25 p_file=NULL; 26 } 27 28 return 0; 29 }
2.4 以文本形式对文件批量处理练习--fputs函数和fgets函数
---- fputs函数可以把一个字符串整体写入到一个文件中区,fgets函数可以从一个文件中读取一个字符串到内存的变量中。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 FILE *p_file=NULL; 7 p_file=fopen("c.txt","w"); 8 if(p_file) 9 { 10 fputs("xyz abc ",p_file); //return EOF if fputs function failed. 11 12 fclose(p_file); 13 p_file=NULL; 14 } 15 return 0; 16
2.5 以文本形式对文件批量处理练习--fprintf函数和fscanf函数
--fprintf函数可以按照指定的格式吧数据写到文件中
--fscanf函数可以按照指定的格式从文件中把数据读出来并记录到变量中
1 #include <stdlib.h> 2 #include <stdio.h> 3 int main() 4 { 5 FILE *p_file=NULL; 6 int value=0; 7 char chr=0; 8 float flo=0.0f; 9 p_file=fopen("d.txt","r"); 10 if(p_file) 11 { 12 fscanf(p_file,"%d %c %g", &value, &chr,&flo); 13 printf("%d\n%c\n%g\n",value,chr,flo); 14 fclose(p_file); 15 p_file=NULL; 16 } 17 return 0; 18 }
1 #include <stdio.h> 2 3 int main() 4 { 5 FILE *p_file=NULL; 6 p_file=fopen("d.txt","w"); 7 if(p_file) 8 { 9 fprintf(p_file, "%d %c %g\n",15,‘y‘,1.8f); 10 11 fclose(p_file); 12 p_file=NULL; 13 } 14 return 0; 15 }
3. 函数变长参数
在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表
下面是 <stdarg.h> 里面重要的几个宏定义如下:
typedef char* va_list;
void va_start ( va_list ap, prev_param ); /* ANSI version */
type va_arg ( va_list ap, type );
void va_end ( va_list ap );
<Step 1> 在调用参数表之前,定义一个 va_list 类型的变量,(假设va_list 类型变量被定义为ap);
<Step 2> 然后应该对ap 进行初始化,让它指向可变参数表里面的第一个参数,这是通过 va_start 来实现的,第一个参数是 ap 本身,第二个参数是在变参表前面紧挨着的一个变量,即“...”之前的那个参数;
<Step 3> 然后是获取参数,调用va_arg,它的第一个参数是ap,第二个参数是要获取的参数的指定类型,然后返回这个指定类型的值,并且把 ap 的位置指向变参表的下一个变量位置;
<Step 4> 获取所有的参数之后,我们有必要将这个 ap 指针关掉,以免发生危险,方法是调用 va_end,他是输入的参数 ap 置为 NULL,应该养成获取完参数表之后关闭指针的习惯。说白了,就是让我们的程序具有健壮性。通常va_start和va_end是成对出现。
1 #include <stdlib.h> 2 #include <stdarg.h> 3 4 void func(int cnt, ...){ 5 va_list v; //find all uncentain variable 6 va_start(v,cnt); 7 int i=0; 8 for(i=0;i<cnt;i++){ 9 printf("%d ", va_arg(v,int)); 10 } 11 printf("\n"); 12 va_end(v); 13 } 14 15 int find_max(int cnt, ...){ 16 int res=1<<31; 17 va_list v; 18 va_start(v,cnt); 19 int i=0; 20 for(i=0;i<cnt;i++){ 21 int tmp =0; 22 tmp =va_arg(v,int); 23 if(tmp>res){ 24 res=tmp; 25 } 26 } 27 va_end(v); 28 return res; 29 } 30 31 int main() 32 { 33 func(3,9,16,-6,17); 34 func(5,1,2,3,4,5); 35 printf("findMax %d\n",find_max(5,5,6,7,8,9)); 36 return 0; 37 }
4. 字符串转成int/float变量 ---atoi/atof 函数
1 #include <stdio.h> 2 #include <stdlib.h> 3 int main() 4 { 5 int value =0; 6 float a_float=0.0f; 7 value=atoi("297"); 8 printf("%d\n",value); 9 a_float=atof("4.7"); 10 printf("%g\n",a_float); 11 return 0; 12 }
5. sprintf和sscanf函数
sprintf() - 主要功能是把格式化的数据写入某个字符串中
sscanf() - 从一个字符串中读进与指定格式相符的数据
1 #include <stdio.h> 2 3 int main() 4 { 5 char a_char=‘t‘; 6 int value =27; 7 float a_float=3.8f; 8 char str[20]; 9 sprintf(str,"%c %d %g\n",a_char,value,a_float); 10 11 printf("%s",str); 12 a_char=0; 13 value=0; 14 a_float=0.0f; 15 16 printf("%c %d %g\n",a_char,value,a_float); 17 sscanf(str,"%c %d %g",&a_char,&value,&a_float); 18 19 printf("%c %d %g\n",a_char,value,a_float); 20 21 return 0; 22 }