LinuxCC++编程:⽂件操作openclose、fopen与freopenfclose
open是linux下的底层系统调⽤函数,fopen与freopen c/c++下的标准I/O库函数,带输⼊/输出缓冲。
linxu下的fopen是open的封装函数,fopen最终还是要调⽤底层的系统调⽤open。
所以在linux下如果需要对设备进⾏明确的控制,那最好使⽤底层系统调⽤(open)
open对应的⽂件操作有:close, read, write,ioctl 等。
fopen 对应的⽂件操作有:fclose, fread, fwrite, freopen, fseek, ftell, rewind等。
freopen⽤于重定向输⼊输出流的函数,该函数可以在不改变代码原貌的情况下改变输⼊输出环境,但使⽤时应当保证流是可靠的
open和fopen的区别:
fread是带缓冲的,read不带缓冲.
fopen是标准c⾥定义的,open是POSIX中定义的.
fread可以读⼀个结构.read在linux/unix中读⼆进制与普通⽂件没有区别.
fopen不能指定要创建⽂件的权限.open可以指定权限.
fopen返回⽂件指针,open返回⽂件描述符(整数).
linux/unix中任何设备都是⽂件,都可以⽤open,read.
1、open、close系统调⽤(linux)
理论
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/*
* 返回:若成功则为新⽂件描述符,若出错为-1
*/
int open(const char* pathname,int oflags);
int open(char*filename,int flags, mode_t mode);
#include <unistd.h>
/*
* 返回:若成功则为 o, 若出错则为 -1(关闭⼀个已关闭的描述符会出错)
*/
int close(int fd);
1、功能:open 函数将 filename 转换为⼀个⽂件描述符,并且返回描述符数字。返回的描述符总是在进程中当前没有打开的最⼩描述符。
2、参数:
pathname 是待打开/创建⽂件的路径名
flags 参数指明了进程打算如何访问这个⽂件:
· O_RDONLY: 只读
· O_WRONLY: 只写。
· O_RDWR: 可读可 写。
以上三者是互斥的,即不可以同时使⽤。⾄少得使⽤上述三个常量中的⼀个
以读的⽅式打开⼀个已存在的⽂件:
fd =open("", O_RDONLY,0);
flags 参数也可以上⾯的⼀个| 下⾯的零个或者多个:
· O_CREAT: 如果⽂件不存 ,就创建它的⼀个截断的 (truncated) (空)⽂件
· O_TRUNC: 如果⽂件巳经 在,就截断它
· O_APPEND: 在每次 操作前,设置⽂件位置到⽂件的结尾处
打开⼀个已存在⽂件,并在后⾯添加⼀些数据:
fd =open("foo .txt", O_ ONLYIO_APPEND,0);
mode 参数仅当创建新⽂件时才使⽤(⽽且必须⽤),⽤于指定⽂件的访问权限。
作为上下⽂的⼀部分,每个进程都会有⼀个umask、它是通过调⽤unmask函数来设置的。
当进程通过带某个 mode 参数的 open 函数调⽤来创建⼀个新⽂件时,⽂件的访问权
限位被设置为mode & ~ umask
2、返回值:
成功则返回⽂件描述符,否则返回 -1。 返回⽂件描述符(整型变量0~255)。由open 返回的⽂件描述符⼀定是该进程尚未使⽤的最⼩描述符。只要有⼀个权限被禁⽌则返回-1。
错误代码:
EEXIST 参数pathname 所指的⽂件已存在,却使⽤了O_CREAT和O_EXCL旗标。
EACCESS 参数pathname所指的⽂件不符合所要求测试的权限。
EROFS 欲测试写⼊权限的⽂件存在于只读⽂件系统内。
EFAULT 参数pathname指针超出可存取内存空间。
EINVAL 参数mode 不正确。
ENAMETOOLONG 参数pathname太长。
ENOTDIR 参数pathname不是⽬录。
ENOMEM 核⼼内存不⾜。
ELOOP 参数pathname有过多符号连接问题。
EIO I/O 存取错误。
实践
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main ()
{
int fd1, fd2;
fd1 =open("a.txt", O_RDONLY,0);
linux重定向
printf("fd1 = %d\n", fd1);
close(fd1);
fd2 =open("b.txt", O_RDONLY,0);
printf("fd2 = %d\n", fd2);
close(fd2);
return(0);
}
现象: 如果⽂件不存在,返回-1。
如果⽂件存在,返回3
分析: Linux shell创建的每个进程开始时都有三个打开的⽂件:标准输⼊(描述符为 0) 、标准输出(
描述符为 1) 和标准错误(描述符为2), open返回的描述符总是在进程中当前没有打开的最⼩描述符。
fopen、freopen、fclose库函数
理论
#include<stdio.h>
/*
* 作⽤:使⽤给定的模式 mode 打开 filename 所指向的⽂件
* 参数:
*  filename -- 这是 C 字符串,包含了要打开的⽂件名称。
*  mode -- 这是 C 字符串,包含了⽂件访问模式
* 返回值:该函数返回⼀个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。
*/
FILE *fopen(const char*filename,const char*mode)
/*
* 作⽤:把⼀个新的⽂件名 filename 与给定的打开的流 stream 关联,同时关闭流中的旧⽂件。
* 参数:
*  filename -- 这是 C 字符串,包含了要打开的⽂件名称。
*  mode -- 这是 C 字符串,包含了⽂件访问模式
*  stream -- 这是指向 FILE 对象的指针(⽂件指针),该 FILE 对象标识了要被重新打开的流。通常使⽤标准流⽂件(stdin/stdout/stderr)
* 返回值:如果成功则返回该指向该stream的指针,否则为NULL。
*/
FILE *freopen(const char*filename,const char*mode, FILE *stream)
/*
* 作⽤:关闭流 stream。刷新所有的缓冲区。
* 参数:  stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流。
* 返回值:如果流成功关闭,则该⽅法返回零。如果失败,则返回 EOF
*/
int fclose(FILE *stream)
mode取值
“r"或"rb” 以只读⽅式打开⽂件,该⽂件必须存在。
“w"或"wb” 以写⽅式打开⽂件,并把⽂件长度截短为零。
“a"或"ab” 以写⽅式打开⽂件,新内容追加在⽂件尾。
"r+"或"rb+“或"r+b” 以更新⽅式打开(读和写)
"w+"或"wb+“或"w+b” 以更新⽅式打开,并把⽂件长度截短为零。
"a+"或"ab+“或"a+b” 以更新⽅式打开,新内容追加在⽂件尾。
字母b表⽰⽂件时⼀个⼆进制⽂件⽽不是⽂本⽂件。(linux下不区分⼆进制⽂件和⽂本⽂件)实践
freopen使⽤
#include <stdio.h>
#include <string.h>
int main ()
{
FILE *fp;
printf("该⽂本重定向到 stdout \n");
fp =freopen("","w+",stdout);// 关联标准输出 STDOUT 到⽂件
printf("该⽂本重定向到 dddddddddddddd\n");
fclose(fp);
return(0);
}
fclose封装
void Fclose(FILE *fp)
{
if(fclose(fp)!=0){
printf("fclose error");
exit(0);
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。