精华内容
下载资源
问答
  • Linux文件IO-open,write,read,lseek,close

    千次阅读 2017-08-09 15:16:01
    在linux编程中,经常用到open,write,read,lseek,close这几个函数。这里系统总结一下。

    在linux编程中,经常用到open,write,read,lseek,close这几个函数。这里系统总结一下。

    一、函数open

    参考:https://linux.die.net/man/2/open

    #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);
    int creat(const char *pathname, mode_t mode);

    返回值:若成功,返回一个文件描述符fd;若失败,返回-1
    函数参数:

    • pathname :打开文件的路径名
    • flags:用来控制打开文件的模式
    • mode:用来设置创建文件的权限(rwx)。当flags中带有 O_CREAT 时,也就是创建新文件时才有效。

    函数creat只是用于创建新文件,这样对比看来open的功能更加强大。
    由于open函数完全可以替代creat函数,所以现在基本上不用creat函数了。

    下面对各个参数进行详细的说明:
    flags参数说明:

    • O_RDONLY:只读模式
    • O_WRONLY:只写模式
    • O_RDWR:可读可写模式

    flags参数必须包括以上3个参数之一,并且只能选择一个。
    还有一些flags参数是可选的,如下:

    • O_APPEND 以追加的方式打开文件
    • O_CREAT 创建一个文件
    • O_EXEC 如果使用了O_CREAT而且文件已经存在,就会发生一个错误
    • O_NOBLOCK 以非阻塞的方式打开一个文件
    • O_TRUNC 如果文件已经存在,则删除文件的内容

    我们可以用符号“|”分隔开,例如,flags为O_RDWR | O_APPEND,表示以可读可写的模式打开文件并且追加到文件后面。
    如果flags中使用了O_CREAT标志,则调用open函数的时候需要加上打开文件的模式,设置文件的用户权限。也就是说使用O_CREAT标志时,open的原型应该是这样的:int open(const char *pathname, int flags, mode_t mode);
    用过chmod命令的就知道这个怎么用了,可以用八进制数据表示,
    其中4:读权限,2:写权限,1:可执行权限,0:无权限。
    下面是mode可取的一些值,都是八进制的值,使用这些值的时候需要包含头文件:sys/types.h,sys/stat.h

    • S_IRWXU 00700 用户可以读
    • S_IRUSR 00400 用户可以写
    • S_IWUSR 00200 用户可以执行
    • S_IXUSR 00100 用户可以读、写、
    • S_IRWXG 00070 组可以读
    • S_IRGRP 00040 组可以写
    • S_IWGRP 00020 组可以执行
    • S_IXGRP 00010 组可以读写执行
    • S_IRWXO 00007 其他人可以读
    • S_IROTH 00004 其他人可以写
    • S_IWOTH 00002 其他人可以执行
    • S_IXOTH 00001 其他人可以读、写
    • S_ISUID 04000 设置用户执行ID
    • S_ISGID 02000 设置组的执行ID

    实际生成的文件的权限还要受到进程的权限掩码的影响的
    如果生成的文件权限跟自己设置的不相符合,请看看是否是root模式下执行的

    二、函数write

    参考:https://linux.die.net/man/2/write

    #include <unistd.h>
    ssize_t write(int fd, const void *buf, size_t count);

    返回值:若成功,返回已写的字节数;若出错,返回-1
    功能:write 函数把buf指针指向的内容写入count 字节数据到文件描述符为fd的文件 。返回值一般总是等于 count,否则就是出错了。
    常见的出错原因是磁盘空间满了或者超过了文件大小限制。如果打开文件时使用了 O_APPEND ,则每次写操作都将数据写入文件末尾。

    三、函数read

    参考:https://linux.die.net/man/2/read

    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);

    返回值:返回所读取的字节数;0(读到EOF);-1(出错)。
    功能:read 函数会从文件描述符fd的文件中读取count字节到从buf地址开始的缓存中。
    参数:

    • fd: 要读取数据的文件描述符。
    • buf:存放读取的数据缓冲区。
    • count: 一次read操作,读多少数量的字节。

    以下几种情况会导致读取到的字节数小于 count :

    1. 读取普通文件时,读到文件末尾还不够 count 字节。
    2. 从终端设备读取时,一般情况下每次只能读取一行。
    3. 从网络读取时,网络缓存可能导致读取的字节数小于 count字节。
    4. 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 count 。 
    5. 在读取了部分数据时被信号中断。
    

    总结:读取到的字节数小于想要读取的字节count,说明了源头没有那么多数据可读。

    四、函数lseek

    参考:https://linux.die.net/man/2/lseek

    #include <sys/types.h>
    #include <unistd.h>
    off_t lseek(int fd, off_t offset, int whence);

    返回值:若成功则返回目前的读写位置,也就是距离文件开头多少个字节。若错误则返回-1。

    所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo。cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数。读写操作通常开始于 cfo,并且使 cfo 增大,增量为读写的字节数。文件被打开时,cfo 会被初始化为 0,除非使用了 O_APPEND 。使用 lseek 函数可以改变文件的 cfo 。

    参数说明:

    • Offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)。

    • whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2)

      1. SEEK_SET 将读写位置指向文件头后再增加offset个位移量。
      2. SEEK_CUR 以目前的读写位置往后增加offset个位移量。
      3. SEEK_END 将读写位置指向文件尾后再增加offset个位移量。

    当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
    举几个例子:

    1. 将读写位置移到文件开头:
      lseek(fd,0,SEEK_SET)
    2. 将读写位置移到文件尾:
      lseek(fd,0,SEEK_END)
    3. 取得目前文件位置:
      lseek(fd,0,SEEK_CUR)

    五、函数close

    参考:https://linux.die.net/man/2/close

    #include <unistd.h>
    int close(int fd);

    返回值:若成功,返回0;若出错,返回-1
    关闭一个文件时还会释放该进程加在该文件上的所有记录锁。
    当一个进程终止时,内核自动关闭它所有的打开文件。很多程序利用了这一功能而不显示地用close关闭打开的文件。

    六、示例程序

    //open.c
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #define FILENAME "hello"
    
    int main()
    {
        //实际生成的文件的权限还要受到进程的权限掩码的影响的
        //如果生成的文件权限跟自己设置的不相符合,请看看是否是root模式下执行的
        int fd = open(FILENAME,O_RDWR | O_CREAT,0777);
        if(fd < 0)
        {
            perror("open");
        }
        printf("open success!\n");
        char write_buf[] = "helloworld!\n";
        if (write(fd,write_buf,sizeof(write_buf)))
        {
            perror("write");
        }
        printf("write success !\n");
        //将文件偏移指针重新指向开头
        if(lseek(fd,0,SEEK_SET) < 0)
        {
            perror("lseek");
        }
        printf("lseek success !\n");    
        char read_buf[20] = {0};
        if (read(fd , read_buf , 20) < 0)
        {
            perror("read");
        }
        printf("read success !\n");
        printf("read_buf = %s\n",read_buf);
        return 0;
    }
    

    实验结果:

    ubuntu:~/test/170809-IO/open$ gcc open.c -o open
    ubuntu:~/test/170809-IO/open$ ./open
    open success!
    write: Success
    write success !
    lseek success !
    read success !
    read_buf = helloworld!
    ubuntu:~/test/170809-IO/open$ ls
    hello  open  open.c
    ubuntu:~/test/170809-IO/open$ cat hello 
    helloworld!
    展开全文
  • 文件描述符,非负整数。当为负数时(通常是-1),代表打开/创建文件出错。 其中文件描述默认值如下: /* Standard file descriptors. */ #define STDIN_FILENO0/* Standard input. */ #define STDOUT_FILENO1/* ...
    文件描述符,非负整数。当为负数时(通常是-1),代表打开/创建文件出错。
    
    其中文件描述默认值如下:
    /* Standard file descriptors.  */
    #define STDIN_FILENO 0 /* Standard input.  */
    #define STDOUT_FILENO 1 /* Standard output.  */
    #define STDERR_FILENO 2 /* Standard error output.  */

    文件IO函数,通常包括 open,read,write,lseek,close这五个函数。
    还有creat函数,但是现在用open已经可以完全替代creat。
    creat = open  + oflag(O_WRONLY|O_CREAT|O_TRUNC)


    int open(const char *pathname , int oflag, mode_t mode);//其中mode_t 是unsigned int类型
    打开pathname文件
    其中oflag的组成:第一组必选其一,第二组任选[0-n]个。
    第一组:文件的打开方式
    O_RDONLY     //只读
    O_WRONLY   //只写
    O_RDWR       //读写
    第二组:其他选项
    O_APPEND    //将当前偏移量指向文件末尾,否则初始值为0
    O_CREAT
    O_EXCL
    O_TRUNC
    O_NOCTTY
    O_NONBLOCK
    O_DSYNC
    O_RSYNC
    O_SYNC

    int close(int filedes);

    关闭指定文件


    off_t lseek(int filedes, off_t offset, int whence);
    修改文件当前指针偏移量,成功返回执行完成后新的文件偏移量,失败返回-1;
    whence取值如下:
    SEEK_SET:从文件开始处(偏移量为0处);
    SEEK_CUR:从当前偏移量处;
    SEEK_END:从文件结尾处;
    因此类似ftell函数的功能(获取当前偏移量)可以用lseek(fd, 0, SEEK_CUR);实现。

    ssize_t read (int fd, void *buf, size_t nbytes);
    读取描述符fd所指向文件,读取到的内容存放到buf中,读取nbytes字节。


    ssize_t write (int fd, const void *buf, size_t nbytes);
    向描述符fd所指向文件写入从buf中读取的数据,共写入nbytes字节。


    返回值汇总:
    open,成功返回非负数文件描述符,失败返回-1;
    close,成功返回0,失败返回-1;
    lseek,成功返回执行完成后新的文件偏移量,失败返回-1;
    read,成功返回读取到的字节数,失败返回-1;
    write,成功返回成功写入字节数,失败返回-1;

    其他:
    关闭一个文件时,还会释放该进程加在该文件上的所有记录锁。
    当一个进程终止时,内核自动关闭它所有打开的文件。


    展开全文
  • MPI-IOOpen/close/delete

    千次阅读 2012-10-23 11:05:05
    MPI_FILE_OPEN(comm, filename, amode, info, fh) IN comm 组内通信域 IN filename 将打开的文件名 IN amode 打开方式 ...OUT fh 返回的文件句柄 int MPI_File_open(MPI_Comm comm, char * filename
    MPI_FILE_OPEN(comm, filename, amode, info, fh)
    IN   comm    组内通信域
    IN   filename  将打开的文件名
    IN   amode    打开方式
    IN   info    传递给运行时的信息
    OUT   fh     返回的文件句柄
    int MPI_File_open(MPI_Comm comm, char * filename, int amode, MPI_Info info, 
          MPI_File * fh)
    MPI_FILE_OPEN(COMM,FILENAME, AMODE, INFO, FH,IERROR)
     CHARACTER *(*) FILENAME
     INTEGER COMM, AMODE, INFO, FH, IERROR
      MPI_FILE_OPEN是一个组调用,即通信域comm中的所有进程都必须按给定的文件名filename来执行它,各进程使用的文件名filename要相同,给定的打开方式amode也要相同,但是各进程传递给运行时的信息info可以互不相同。该调用返回一个文件句柄fh,以后各进程对文件的具体操作都是通过文件句柄fh来实现的。
      根据用途的不同,打开方式可以是如下所示的任何9种方式之一。
    文件打开方式 
    
    打开方式	含义
    MPI_MODE_RDONLY	只读
    MPI_MODE_RDWR	读写
    MPI_MODE_WRONLY	只写
    MPI_MODE_CREATE	若文件不存在则创建
    MPI_MODE_EXCL	创建不存在的新文件,若存在则错
    MPI_MODE_DELETE_ON_CLOSE	关闭时删除
    MPI_MODE_UNIQUE_OPEN	不能并发打开
    MPI_MODE_SEQUENTIAL	文件只能顺序存取
    MPI_MODE_APPEND	追加方式打开,初始文件指针指向文件尾
    
    
    
    MPI_FILE_CLOSE(fh)
    INOUT   fh    前面打开的文件句柄
    int MPI_File_close(MPI_File * fh)
    MPI_FILE_CLOSE(FH,IERROR)
      INTEGER FH, IERROR
    
      MPI_FILE_CLOSE关闭前面已经打开的与句柄fh相联系的文件,它也是一个组调用,即所有打开该文件的进程,也必须都执行关闭操作。这里虽然没有明确指出通信域或进程组,但是,文件句柄fh已包含了进程组的信息。
    
    MPI_FILE_DELETE(filename, info)
    IN   filename    将删除的文件名
    IN   info      传递给运行时的信息
    int MPI_File_delete(char * filename, MPI_Info info)
    MPI_FILE_DELETE(FILENAME, INFO, IERROR)
      CHARACTER *(*) FILENAME
      INTEGER INFO, IERROR
    
    MPI_FILE_DELETE删除指定的文件filename。



    http://comic.sjtu.edu.cn/thucs/GD_jsj_014b/content/chapter17/section1/part01/index1.htm

    展开全文
  • vs2013编译caffe的io.cpp文件错误,openclose无法识别, 解决方法: 将下列代码放在io.cpp的前面 #ifdef _MSC_VER #define open _open #endif 在有close(fd)的地方改为  #ifdef _MSC_VER  close(fd);  #else ...

    vs2013编译caffe的io.cpp文件错误,open和close无法识别,

    解决方法:

    将下列代码放在io.cpp的前面

    #ifdef _MSC_VER
    #define open _open
    #endif

    在有close(fd)的地方改为

      #ifdef _MSC_VER
         close(fd);
      #else
         _close(fd);
      #endif

    最重要的是_open(),_close()是io.h中的函数,所以,要在最前面加上#include ”io.h“,问题解决

    哦,忘了,还是出现了下述问题:

    error C4996: 'close': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name:    

    解决办法

    这个问题在VS 2012之前的版本中是不会当做错误的,只是提出一个警告。为了避免报错,可以使用以下两个宏定义来屏蔽掉这种错误。

    在io.cpp文件的属性->c/c++->预处理器->预处理器定义中添加:

        _CRT_SECURE_NO_DEPRECATE 

        _CRT_NONSTDC_NO_DEPRECATE 



    展开全文
  • 系统文件IOopen() close() read() write() lseek() 区别:标准文件IO只能读写普通文本文件和二进制文件;系统文件IO不仅可以读写普通文件和二进制文件还可以读写系统底层设备文件;加锁的文件必须使用系统文件IO...
  • 5-文件IO-read/write/open

    千次阅读 多人点赞 2016-09-17 15:17:06
    小结本着在使用中学习的原则,现在提出一个需求,使用 linux 系统接口来实现文件拷贝命令。在上一篇博文中,已经简单了解了库函数和系统接口的区别。本文将继续学习 write,另外还将学习另外两个系统接口 read 和 ...
  • 如:openclose,write,read,ioctl等 文件IO与标准IO的权限对比 open函数 运行结果: 为什么文件描述符fd为3? 因为0,1,2是标准IO输入/输出/错误输出给占用了,一个进程被创建都会默认有这三个文件...
  • 文件IO

    千次阅读 2016-08-09 09:11:09
    Linux文件 IO笔记整理
  • Linux文件IO详解

    千次阅读 2018-06-04 19:47:26
    带缓存的IO函数:open, read, write, lseek和close。每个函数对应内核的一个系统调用,这些函数不是C语言标准,但属于POSIX接口。 文件描述符 对Linux而言,所有的打开文件都由文件描述符引用。文件描述符是一...
  • Unity文件IO

    千次阅读 2018-12-13 14:50:50
    文件系统与IO 文件系统对应类 System.IO DriveInfo : 有关驱动器信息的类 主要方法:GetDrives 用于取得本计算机中所有驱动器信息对象 File: 有关对文件整体操作及内容读写的类 整体操作: Create :创建文件 Delete:...
  • 标准IO文件IO 的区别

    千次阅读 2017-09-05 14:15:02
    在谈两者区别之前,先来了解下什么是标准IO以及文件IO。1 定义标准IO: 标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存...
  • Linux文件IO_01

    千次阅读 2019-04-08 16:22:43
    Linux文件IO0.综述1.Linux常用文件IO接口(API)3.IO实例3.1打开文件3.2读取文件内容3.3向...操作一个文件一般是先打开(open)一个文件,得到这个文件文件描述符,然后对文件进行读写(read/write)或其他操作,...
  • 文件IO和标准IO区别及其效率

    千次阅读 2016-10-16 21:10:20
    文件IO 就指的是我们通常讲的openclose、write、read等API函数构成的一套用来读写文件的体系,这套体系可以很好的完成文件读写,但是效率并不是最高的。 标准IO应用层C语言库函数提供了一些用来做文件读写的函数...
  • 【Unix】文件IO与标准IO

    千次阅读 2010-02-09 10:16:00
    一、文件IO 大多数UNIX文件IO只需用到5个函数:open、read、write、lseek以及close。 这些函数经常被称为带缓存的IO(unbuffered IO),带缓存是指每个read和write都调用内核中的一个系统调用。 这些带缓存的IO...
  • Linux文件IO_02

    千次阅读 2019-04-09 16:14:59
    Linux文件IO_024.lseek函数详解4.1lseek函数介绍4.2lseek实践:计算文件长度5.文件共享的实现5.1文件共享概念5.2文件共享的3种实现方式5.3文件描述符细节6.C语言标准库的文件IO介绍 4.lseek函数详解 4.1lseek函数...
  • Python中文件的读写包含三个步骤:打开文件,读/写文件,关闭文件文件打开之后必须关闭,因为在磁盘上读写文件的功能是由操作系统提供的,文件作为对象,被打开后会占用操作系统的资源,而操作系统在同一时间内...
  • Python3中打开文件的方式(With open

    万次阅读 多人点赞 2018-08-05 19:53:16
    python文件读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统允许普通的程序直接操作磁盘...
  • Python基础语法全体系 | 文件IO与常用文件操作模块

    千次阅读 多人点赞 2019-12-31 05:30:08
    《Python基础语法全体系》系列博文第六篇,本篇博文将讲解Python的文件IO操作,包括文件的打开、读取和写入。本文整理自疯狂python编程。 文章目录使用pathlib操作目录使用os.path操作目录使用fnmatch处理文件名...
  • C语言文件IO复习总结

    千次阅读 2018-09-12 20:14:50
    在Linux操作系统中,万物皆文件(everything is file),而今天进行复习的就是文件I/O,文件I/O基于POSIX标准,在进行文件I/O的过程中,每一次操作都会进行系统调用,增加大量系统开销,而我们后面讲到的标准I/O就大大...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 228,035
精华内容 91,214
关键字:

文件io的只open不close