文件I/O函数解析

标准i/o的常用apti解析:

文件流:

FILE *fopen(const char *path,const char *mode)

第一个参数:是全路径,即你需要打开的文件的路径;第二个参数是打开方式,

诸如"r","w","a"等多种打开方式,自己可以查一下;

该函数是将文件流和文件相关联的的函数,也是对文件操作的第一步(当然还有

其他api也可以实现相等的功能)。

FILE *freopen(const char *path,const  char *mode,FILE *stream);

第一个参数是全路径,第二个参数打开方式(同上),第三个参数需要打开的文件流

对文件的操作:

读写操作:

读字写符i/o

读字符:int getc(FILE *stream);其中的参数可以从stream对应的文件中读入

一个字符,因而可以有getc(stdin)

int fgetc(FILE *strem);作用筒上

int getchar(void);

写字符:int putc(int c,FILE *stream);第一个参数,是需要输入的字符,第二

是关联需要写入的文件流。

int fputc(intc,FILE *stream);同上

int putchar(int c);

通过上面这两个函数可以实现linuxshellcat命令:也可以实现cp命令,源码

如下:

 #include<stdio.h>

  3 #include<stdlib.h>

  4 int main(int argc,char *argv[]){

  5         FILE *fp=NULL;

  6         char ch;

  7         fp=fopen(argv[1],"r");

  8         if(!fp){

  9                 printf("cannot open the file:\n");

 10                 return 0;

 11         }

 12         else {

 13                 ch=fgetc(fp);

 14                 while(ch != EOF){

 15                         printf("%c",ch);

 16                         ch=fgetc(fp);

 17                 }

 18                 fclose(fp);

 19                 return 0;

 20         }

 21 

 22 

 23 }

i/o;

fgetsgets的解析:

fgets原型是:char *fgets(char *s,int size,FILE *fp);

第一个参数是在程序中需要定义的缓冲空间;第二个参数是需要从fp流关联的文

件中读出的个数减一(size-1);第三个参数是和文件关联的流。

例如:

char s[100];

fgets(s,10,stdin); //表示在执行时从键盘输入9个字符

对于这个函数有几种情况;

1,输入时小于9个字符,如:输入a;那么sizeofs==2,这里解释下

,因为通过fgets()这个函数输入字符串时,如果小于指定字符的话,会在将a

出后,在其后加上\n\0;

2当在输入的字符大于9时,fgets()会截断9个字符,并在其后添加

\0,sizeof(s)==9;

gets()函数原型是 char*gets(char *s);

其参数表示需要输入的空空间的首地址,可以超越其指定空间大小输入,这也是

该使用该函数危险的重要原因,因而,需要慎重使用

两者的区别:

1gets()输入时只有一个换行符,即用putss)输出时只换一次行,但fgets

()在小于指定字节范围内,fgets()会给窜末尾添加一耳光换行符,即用puts

s)输出时,有两次换行。

2gets()可以输入超过定义空间大小的字符,产生溢出,很危险,fgets()当输

入超过指定大小时,会截断你的输入,并将指定的字节输入,不会产生溢出,很

安全

写行I/O

int puts(const char *s);

int fputs(const char *s,FILE *stream);第一个参数,是缓冲空间的首地址,

第二个参数是关联需要写入的流;

通过上面的函数可以实现linuxcat以及cp命令,源码如下:

cp的实现:

 #include<stdio.h>

  3 #include<stdlib.h>

  4 int main(int argc,char *argv[]){

  5         FILE *fp,*fp1;

  6         char ch[100];

  7         fp=fopen(argv[1],"r");

  8         if(NULL == (fp=fopen(argv[1],"r"))){

  9                 printf("cannot open the file:\n");

 10                 return 0;

 11         }

 12         if(NULL == (fp1=fopen(argv[2],"w"))){

 13                 printf("cannot open argv[2]\n");

 14                 return 0;

 15         }

 16 

 17         while(fgets(ch,100,fp) != NULL){

 18                 fputs(ch,fp1);

 19         }

 20                 fclose(fp);

 21                 fclose(fp1);

 22                 return 0;

 23         }

文件i/o快读写:

size_t fread (void *ptr,size_t size,size_t,nemb,FILE *stream);第一个参

数是缓冲空间,第二个参数是对应数据类型的大小,第三个参数是,需要几个这

个数据类型大小;第三个参数,关联文件的流。

size_t fwrite(const void *ptr,sizr_t size,size_t nemmb, FILE *stream)

;第一个参数是区数据的缓冲空间,第四个参数是血药写入的文件关联流。

可以通过上面代码实现cp,源码如下:

  2 #include<stdio.h>

  3 #include<stdlib.h>

  4 #include<string.h>

  5  int main(int argc,char *argv[]){

  6         FILE *fp,*fp1;

  7         char ch[10000];

  8           fp=fopen(argv[1],"r");

  9           if(NULL == (fp=fopen(argv[1],"r"))){

 10                   printf("cannot open the file:\n");

 11                  return 0;

 12          }

 13          if(NULL == (fp1=fopen(argv[2],"w"))){

 14                  printf("cannot open argv[2]\n");

 15                   return 0;

 16          }

 17         while(fread(ch,sizeof(char),9999,fp)){

 18                 printf("to here\n");

 19                 fwrite(ch,sizeof(char),strlen(ch),fp1);

 20                 return 0;

 21         }

 22 

 23 }

标准i/o定位流

int fseek(FILE *stream,long offset,int whence);第一个参数,是关联需要定

位的流,第二个参数是偏移量,第三个参数是偏移的参照位置(SEEK_CUR(当前)

SEEK_SET(文件开始)SEEK_END(文件末尾)

int ftell(FILE *stream);返回当前文件流指向的位置

int rewind(FILE *stream);将文件流重定向到文件的开始位置

测试代码如下:

  2 #include<stdio.h>

  3 int main(int argc,char *argv[]){

  4         FILE *fp;

  5         if(NULL == (fp=fopen(argv[1],"r"))){

  6                 printf("cannot open %s\n",argv[1]);

  7                 return 0;

  8         }

  9         while(!fseek(fp,100,SEEK_END)){ //fseek执行成功返回0,失败

返回-1,其

    功能是,将fp偏向第三个参数(SEEK_CUR(当前位置,SEEK_END(

),SEEK_SET(开始

    位置)) )100个字节

 10                 printf("current offest is: %ld\n",ftell(fp));

 11                 fseek(fp,100,SEEK_CUR);

 12                 printf("current offest is: %ld\n",ftell(fp));

 13                 rewind(fp);

 14                 printf("current offest is: %ld\n",ftell(fp));

 15                 return 0;

 16         };

 18 }

关闭文件流:

int fclose(FILE *stream);

刷新缓存:int fflush(FILE *fp)-----非常重要      

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值