fopen 与 open

来源:互联网 发布:ubuntu搜狗输入法消失 编辑:程序博客网 时间:2024/06/13 21:00

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>

0 0
原创粉丝点击