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+ 以可读写方式打开文件,该文件必须存在。
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>