fopen 与 open

fopen和open都是用于打开文件,fopen是C语言标准库函数,更易移植,open遵循POSIX标准,更适合UNIX系统。fopen的mode参数以字符串形式表示操作模式,如'r'、'w'等;open的oflag参数更为详细,如O_RDONLY、O_APPEND等。open在O_CREAT和O_EXCL组合下可以检查文件是否存在。在追加写入时,fopen和open都需要特定模式。

fopen 和 open 函数都可以用来打开一个文件,但是他们还是有很大区别的。

1.  fopen 函数是C语言的标准库函数,更具有可移植性,函数原型:

       #include <stdio.h>

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

       path 是文件的绝对路径,如果只传递给文件名,则默认操作的是当前工作目录的文件。


     open 函数是POSIX标准定义的,适合于UNIX系统里使用,函数原型:

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <fcntl.h>

       int open(const char *pathname, int flags);
       int open(const char *pathname, int flags, mode_t mode);

2.  对于文件的操作方式对应的参数

      fopen函数中,参数mode字符串代表着流形态mode有下列几种形态字符串:

     r      以只读方式打开文件,该文件必须存在。

     r+    以可读写方式打开文件,该文件必须存在。

     rb+  读写打开一个二进制文件,允许读写数据,文件必须存在。

     rw+  读写打开一个文本文件,允许读和写。

     w      打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

     w+    打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

     a      以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件 

             尾,即文件原先的内容会被保留。 

          (EOF符保留)

     a+    以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件

             尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)

     wb    只写打开或新建一个二进制文件;只允许写数据。

     wb+  读写打开或建立一个二进制文件,允许读和写。

     ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。

      open 中,oflag参数常用:

      5个必选常量,且只能指定一个,

      O_RDONLY                             只读打开
      O_WRONLY                            只写打开
      O_RDWR                                 读、写打开

      O_EXEC                                   只执行打开
      O_SEARCH                             只搜索打开

      可选常量(常用的),可选是指以下常量与上面5个常量之一取‘|’运算,

      O_APPEND                             每次写时都追加到文件的尾端(类似于fopen的‘a’);

      O_CREAT                                若此文件不存在则创建它。使用此选项时,open函数需同时说明第3个参数mode,

                                                       用mode指定该新文件的访问权限位。

      O_EXCL                                   如果同时指定了O_CREAT,而文件已经存在,则出错。用此可以测定一个文件是否

                                                      存在,如果不存在,则创建此文件。

      O_NOFOLLOW                       如果path引用的是一个符号链接,则出错。

      O_NONBLOCK                       如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文

                                                      件的本次打开操作和后续的I/O操作设置非阻塞方式。

      由以上两者的参数比较看出,open 的各个参数作用都分的很细,直接作用于系统。

3.   文件的创建方式不同

      fopen 函数,当以写的方式打开一个文件时,若文件不存在则自动创建一个文件。 

<span style="font-size:18px;"> #include<stdio.h>
 #include<stdlib.h>
 
 main()
 {
     FILE*    fp;
     if((fp=fopen("file.txt","w"))==NULL)
     {
         printf("error");
         exit(0);                           
     }
 }
</span>
     open 函数当只以读写方式打开时,文件不存在就会出错,要想像fopen一样文件不存在就自动创建就必须再给它指定创建文件的参数:   

<span style="font-size:18px;"> #include<stdio.h>
 #include<stdlib.h>                                             
 #include<fcntl.h>
 
 main()
 {
     int    fd;
     if((fd=open("file.txt",O_CREAT|O_RDWR,S_IRWXU))==-1)// 还应指定权限,如 S_IRWXU是可读可写可执行权限,根据情况                                                             选择
     {
         printf("error");
         exit(0);
     }
 }
</span>

4.  文件追加写入

     open 追加时,应加参数O_APPEND,不可单独使用这个参数,以下代码是将abcdef追加到文件尾端:   

<span style="font-size:18px;">#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>

main()
{
    int    fd;
    char   str[]="abcedf";
    if((fd=open("file.txt",O_APPEND|O_RDWR,S_IRWXU))==-1)
    {
        printf("error");
        exit(0);
    }
    write(fd,str,6);                                      
}
</span>
     而fopen函数追加时,可单独使用 ‘a’参数即可:

<span style="font-size:18px;">fp=open("file.txt","a");</span>

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值