zoukankan      html  css  js  c++  java
  • Python fopen,open,和popen的区别

    1.  fopen    

    • 打开普通文件
    • 带缓冲区撒点粉撒点粉阿桑地方
    • 缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据

    函数原型:FILE * fopen(const char * path,const char * mode);

    所需库:<stdio.h>
    返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。
    参数说明:
    参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态
    mode有下列几种形态字符串:
    r 以只读方式打开文件,该文件必须存在。
    r+ 以可读写方式打开文件,该文件必须存在。
    rb+ 读写打开一个二进制文件,允许读写数据
    rw+ 读写打开一个文本文件,允许读和写。
    w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
    w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
    a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
    wb 只写打开或新建一个二进制文件;只允许写数据。
    wb+ 读写打开或建立一个二进制文件,允许读和写。
    ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
    at+ 打开一个叫string的文件,a表示append,就是说写入处理的时候是接着原来文件已有内容写入,不是从头写入覆盖掉,t表示打开文件的类型是文本文件,+号表示对文件既可以读也可以写。
    上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask 值。
    有些C编译系统可能不完全提供所有这些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,读者注意所用系统的规定。
     

    2.  open    

    • 打开设备文件
    • 不带缓冲区
    • 非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针,只能读写二进制文件,但效率高、速度 快
     
    函数原型:int open(const char *pathname, int flags);
                    int open(const char *pathname, int flags, mode_t mode);
     
    所需库:<fcntl.h>
    返回值:成功则返回文件描述符,否则返回 -1;
    参数说明:
    对于open函数来说,第三个参数仅当创建新文件时(即 使用了O_CREAT 时)才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的POSIX路径名(如/home/user/a.cpp);flags 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于fcntl.h)通过逻辑位或逻辑构成。
    1. O_RDONLY 只读模式
    2. O_WRONLY 只写模式
    3. O_RDWR 读写模式
    打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:
    • O_APPEND 每次写操作都写入文件的末尾
    • O_CREAT 如果指定文件不存在,则创建这个文件
    • O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
    • O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
    • O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
    • O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O
    设置为非阻塞模式
    • (nonblocking mode)
    以下三个常量同样是选用的,它们用于同步输入输出
    • O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
    • O_RSYNCread等待所有写入同一区域的写操作完成后再进行
    • O_SYNC 等待物理 I/O 结束后再write,包括更新文件属性的 I/O
     

    3.popen    

    • 打开管道
    函数原型:FILE * popen ( const char * command , const char * type );
    所需库:<stdio.h>
    返回值:如果调用 fork() 或 pipe() 失败,或者不能分配内存将返回NULL,否则返回标准 I/O 流。
    参数说明:type 参数只能是读或者写中的一种,得到的返回值(标准 I/O 流)也具有和 type 相应的只读或只写类型。如果 type 是 "r" 则文件指针连接到 command 的标准输出;如果 type 是 "w" 则文件指针连接到 command 的标准输入。
    command 参数是一个指向以 NULL 结束的 shell 命令字符串的指针。这行命令将被传到 bin/sh 并使用-c 标志,shell 将执行这个命令。
  • 相关阅读:
    [写代码]处理一组lrc歌词文件
    [ubuntu]windows重装以后,恢复grub引导
    [HDOJ1878]欧拉回路
    [写代码]解析自定义数据库文件的思路
    [写代码]wordList——百词斩CLI版
    [HDOJ2544]最短路
    [HDOJ1285] 确定比赛名次
    [HDOJ1232]畅通工程
    [HDOJ2717]Catch That Cow
    jQuery实现点击开关图片切换
  • 原文地址:https://www.cnblogs.com/wspblog/p/4282381.html
Copyright © 2011-2022 走看看