fopen与open的区别

一、fopen与open的区别

1、来源不同:
open是unix系统调用函数(包括Linux),返回的是文件描述符,它是文件描述符表里的索引。
fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调不同的内核api,返回的是一个指向文件结构的指针。
2、移植性:
从来源看,fopen是C标准函数,因此拥有良好的移植性,而open是unix系统调用,移植性有限,如windows下相似的功能使用api函数CreatFile。
3、使用范围
open返回文件描述符,而文件描述符是unnix系统下的重要概念,unix下的一切设备都是文件的形式操作,如网络套接字、硬件设备等、当然包括操作普通正规文件(Regular File)
Fopen是从来操纵普通正规文件(Regular File)的
4、 文件IO层次
如果从文件IO的角度来看,open属于低级IO函数,fopen属于高级IO函数,低级和高级的简单区分标准是:谁离系统内核更近,低级文件IO运行在内核态、高级文件IO运行在用户态。
5、 缓冲区
open没缓冲区,fopen有缓冲区
缓冲文件系统:fopen是在缓冲区中进行文件操作的。
非缓冲文件系统:open是通过系统调用,在内核中进行文件操作的。

二、fopen的使用

FILE *fp;
 
FILE *fopen(const char *path, const char *mode);
      
const char *path:要打开的文件名
const char *mode:打开文件的权限
 
pf = fopen("/file.txt","w+");  举例说明
 
"w+":一定要加双引号。
 
fopen的打开方式:
mode打开模式:r : 只读方式打开一个文本文件
w:只写方式打开一个文本文件
r+:可读可写方式打开一个文本文件 
w+:可读可写方式创建一个文本文件

三、fwrite的使用

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
 
const void *ptr:一个要写数据的缓存
size_t size:代表一个字符的大小
size_t nmemb:代表写入多少个字符
FILE *stream:写入到哪个文件
 
举例:
char *str = "my name is Chian!";
 
fwrite(str,sizeof(char),strlen(str),fp);//一次写一个字符,写这么多次
fwrite(str,sizeof(char)*strlen(str),1,fp);//一次写这么多个字符,写一次
 

四、fread的使用

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
 
void *ptr:一个读取数据的缓存区
size_t size:一个字符的大小
size_t nmemb:一共读取多少个字符
FILE *stream:从哪个文件读
 

五、fseek的使用

int fseek(FILE *stream, long offset, int whence);
  
FILE *stream:  指要操作文件的文件描述符
long offset:   指光标的偏移值
int whence:    指定位光标的位置
 

举例代码:

#include <stdio.h>
#include <string.h>
 
 
int main(){
 
 
        FILE *fd;
        char *str = "this is boy";
 
        char readBuf[128] = {0};
        // FILE *fopen(const char *path, const char *mode);
        fd = fopen("./file3","w+");   //打开文件
 
        //size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
 
        //fwrite(str,sizeof(char),strlen(str),fp);
        fwrite(str,sizeof(char)*strlen(str),1,fd);  //把数据写到文件中
        fseek(fd,0,SEEK_SET);                       //移动光标到文件开头
 
        fread(readBuf,sizeof(char),strlen(str),fd); //读取刚才写的文件数据
 
        printf("read data :%s\n",readBuf);
        fclose(fd);
        return 0;
}
 

执行结果:

六、写入结构体到文件

#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
 
struct Test{
 
        int a;
        char b;
};
 
int main(){
 
        FILE *fd;
        struct Test data = {100,'h'};
        struct Test data2;
        fd = fopen("./file1","w+");
 
        int n_write = fwrite(&data,sizeof(struct Test),1,fd);
 
        fseek(fd,0,SEEK_SET);
 
        int n_read = fread(&data2,sizeof(struct Test),1,fd);
        printf("read  data :%d,%c\n",data.a,data.b);
        
 
        fclose(fd);
        return 0;
}

执行结果:

七、fputc的使用

int fputc(int c , FILE *stream); 写一个字符到文件中
 
 
#include <stdio.h>
#include <string.h>
 
int main(){
 
        FILE *fp;
       
        fp = fopen("./test.txt","w+");
 
        fputc('a',fp);    //写一个字符到文件中
 
        fclose(fp);
        return 0;
}
 
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值