Linux C——带IO缓冲的文件操作函数

一、有哪些带缓存的API函数

1. fopen

函数的作用: 打开文件

函数的原型: FILE *fopen(const char *pth, const char *mode)

mode:

   r:读,文件必须存在;

   r+:打开可读写,文件必须存在;

   

   w:打开只写文件,文件不存在就会创建文件; 文件清0

   w+:打开可读写的文件,

   

   a:附加的形式打开只写文件,不存在就创建,存在就写到原来的文件尾。

   a+:以附加的形式打开可读写的文件,不存在就创建,存在就写到原来的文件尾。

   

   b:二进制文件

   

 文件头: #include <stdio.h>

 返回值:  成功是指向=文件流的指针;

          出错返回NULL;     

 

2.fputc

 函数的作用:  将一个指定的字符写入到文件流中;

 函数的原型:  int fputc(int c, FILE *stream);

 返回值:   返回写入成功的字符,c;  EOF则表示失败。

 

 3.fgetc

 函数的作用:从文件流中读取一个字符

 函数原型: int fgetc(FILE *stream)

 返回值:返回值正常的是读取的字符;EOF表示到了文件尾;

 

4.fputs

函数的作用:将一个字符串写入到文件内

函数的原型: int fputs(const char *s, FILE *stream)

返回值:成功返回写成字符数; EOF表示出错

 

5. fgets

函数的作用:从文件中读取一个字符串;

函数的原型: char *fgets(char *s, int size,  FILE *steam)

函数的参数:

  stream中读size-1个字符到s

返回值: 成功返回s, 出错NULL

 

6. fread

函数的作用:从文件流中读取数据块

函数原型:  size_t  fread(void *ptr,  size_t size, size_t  nmemb, FILE * stream);

返回值: 返回实际读到数据块的数目

        nmember小的话,可能是到了文件尾,或者错误发生。

        feof :到文件尾;

        ferror:判断错误的

 

7.fwrite

函数的作用: 将数据块写到文件流中:

函数原型:  size_t  fwrite(const void * ptr,  size_t size,  size_t nmemb,  FILE *stream);

返回值: 实际写入的nmemb数目;

 

8.fseek

函数的作用:移动文件流的读写位置

函数的原型: int fseek(FILE * stream, long offset, int whence)

返回值:成功返回0, 出错-1

 

9 ftell

函数的作用:读取文件流的读写位置;

函数的原型:long ftell(FILE * stream)

返回值: 成功返回当前的读写位置;

         出错-1

         

10. feof

函数的作用: 检测文件流是否到了文件尾

函数的原型:int feof(FILE *steam)

返回值:  非零代表到了文件尾,其他是0

 

11. fprintf

函数的作用:格式化数据到文件

函数的原型: int fprintf(FILE *stream, const char *format, ....);

返回值:成功返回实际输入的字符数,失败-1

 

12. fscanf

函数的作用: 格式化字符串输入

函数的原型: int fscanf(FILE *strem, const char *fromat,....)

返回值:成功返回参数数目,出错-1

 

二、如何使用API函数

1.分析各个函数在实例中的应用

①读写文件的实例

#include <stdio.h>

#define LENGTH 100

main()

{

 FILE *fd;

 char str[LENGTH];

 

 fd = fopen("hello.txt", "w+"); /* 创建并打开文件 */

 if (fd)

 {

  fputs("Hello, Software Weekly", fd); /* 写入Hello, software weekly字符串 */

  fclose(fd);

 }

 

 fd = fopen("hello.txt", "r");

 fgets(str, LENGTH, fd); /* 读取文件内容 */

 printf("%s\n", str);

 fclose(fd);

}

2.如何使用带缓冲的IO操作进行文件复制

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdio.h>

 

#define BUFFER_SIZE 1024

 

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

{

int from_fd,to_fd;

int bytes_read, bytes_write;

char buffer[BUFFER_SIZE];

char *ptr;

 

if(argc!=3)

{

fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]);

exit(1);

}

if((from_fd=open(argv[1],O_RDONLY))==-1)

{

fprintf(stderr,"Open %s Error:%s/n",argv[1], strerror(errno));

exit(1);

}

if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)

{

fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno));

exit(1);

}

while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))

{

if((bytes_read==-1)&&(errno!=EINTR))   /* 一个致命的错误发生了 */

break;

else if(bytes_read>0)

{

ptr=buffer;

while(bytes_write=write(to_fd,ptr,bytes_read))

{

if((bytes_write==-1)&&(errno!=EINTR))      /* 一个致命错误发生了 */

break;

else if(bytes_write==bytes_read)           /* 写完了所有读的字节 */

        break;

/* 只写了一部分,继续写 */

  else if(bytes_write>0)

{

ptr+=bytes_write;

bytes_read-=bytes_write;

}

}

/* 写的时候发生的致命错误 */

if(bytes_write==-1)

break;

 

}

}

 

close(from_fd);

close(to_fd);

exit(0);

}

 

3.比较两种文件操作,如何判断是否到了文件尾?

不带缓冲的:使用lseek

带缓冲的:使用fread函数,如果返回的是0的话,就表示文件流到了文件尾

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值