zoukankan      html  css  js  c++  java
  • Linux系统下文件的通用操作方法

          每一个系统下都有对文件操作的应用,但是都大致相同,同样在Linux系统中也同样拥有对文件的操作。如:文件描述符、open()函数、close()函数、read()函数、write()函数、文件偏移lseek()函数、获取文件状态fstat()函数、文件空间映射mmap()函数、取消mmap()映射的munmap()函数、文件属性fcntl()函数和文件输入输出控制ioctl()函数。此处主要说open()函数、close()函数、read()函数、write()函数

          一、文件描述符

         文件描述符是一个整形的数据,所有对文件的操作都通过文件描述符实现。在Linux系统中用文件描述符表示设备文件和普通文件。文件描述符是文件系统中连接用户空间和内核空间的枢纽。而文件描述符的范围为0~OPEN_MAX,它是一个有限的资源,在使用完毕后需要及时释放。

         在Linux系统中有3个已经分配的文件描述符,即标准输入、标准输出和标准错误,它们的文件描述符的值分别为0、1和2.

         二、打开创建文件open()、create()函数

         open()函数的原型:

    1 int open(const char *pathname,int flags);
    2 int open(const char *pathname,int flags,mode_t mode);

         对于open()函数,在使用时需要包含头文件sys/types.h、sys/stat.h、fcntl.h。通常在用户通过open()函数打开pathname指定的文件后,该函数会返回一个值,如果打开成功,返回一个整形的文件描述符。再出错时会返回-1。对于pathname所指的是一个字符串变量,该字符串变量的长度一般为1024个字节。对于超过这个大小以后,系统会自动截断,选择最前面的字节操作。

         对于flags变量是文件标志变量,用于判定文件的打开方式,其中文件的打开方式可以为只读、只写或读写方式打开,分别用O_RDONLY、O_WRONLY、O_RDWR表示,并且在打开文件的方式时必须使用这三种方式中的其一。在这三个参数中O_RDONLY通常定义为0、O_WRONLY定义为1、O_RDWR定义为2。

         除这上述的三种打开方式外还有其他的一些参数。

            如:O_APPEND:使每次对文件进行写操作都追加到文件的尾端。

          O_CREAT:如果文件不存在则创建文件

          O_EXCL :查看文件是否存在,如果存在则返回-1

          O_TRUNC:将文件的长度截断为0.如果此文件存在,并且文件成功打开,则会将其长度截断为0。

          O_NONBLOCK:以非阻塞方式打开文件,默认的是阻塞方式。

     1 #include<sys/types.h>
     2 #include<sys/stat.h>
     3 #include<fcntl.h>
     4 #include<stdio.h>
     5 int main(void)
     6 {
     7    int fd = -1;
     8    char filename[]="test.txt";
     9    fd = open(filename,O_RDWR);
    10    if(fd == -1) 
    11       printf("文件打开失败!,fd:%d\n",fd);
    12    else 
    13       printf("文件 %s 打开成功!,fd:%d\n",filename,fd);
    14 return 0;
    15 }

      二、关闭文件close()函数

      close()函数关闭一个打开的文件,之前打开文件所占用的资源。

      close()函数的原型:

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

      close()函数关闭的是一个文件描述符,关闭以后此文件描述符不再指向任何文件,从而文件描述符可以再次使用。当函数执行成功时返回0,执行错误时返回-1.

      close()函数的例子:

     1 #include<sys/types.h>
     2 #inlcude<sys/stat.h>
     3 #include<fcntl.h>
     4 #include<unistd.h>
     5 #include<stdio.h>
     6 int mian(void)
     7 {
     8    int fd=0;
     9    fd=open("test.txt",O_RDONLY);
    10    if(fd >0) 
    11       printf("文件打开成功!,fd:%d\n",fd);
    12    else 
    13    {
    14       printf("文件打开失败!\n");
    15       exit(0);  
    16    }
    17 close(fd);
    18 return 0;
    19 }

      三、读取文件read()函数

      read()函数从打开文件中读取数据,用户可以对读入的数据进行操作。

      read()函数的原型:

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

      read()函数从文件描述符fd对应的文件中读取count字节,放到buf开始的缓存区中,如果count为0,read()函数返回0;如果count大于SSIZE_MAX,结果不可预料。当read()函数的返回结果为-1时,说明读取函数有错误,在达到文件末尾时,返回0。

      在使用read()函数时,count请求的字节数量,read()函数不一定能够读取这么多数据,在很多中情况下可以使实际上读取的字节数小于请求读取的字节数。

         如:

        (1)、读取普通文件时,文件中剩余的字节数不够请求的字节数。

        (2)、当从中断设备数据的时候,其默认长度不够read()函数请求读取的字节数。

        (3)、当从网络读取数据时,缓存区大小有可能小于读取请求的数据大小。

      read()函数的例子:

     1 #include<sys/types.h>
     2 #include<sys/stat.h>
     3 #include<fcntl.h>
     4 #include<unistd.h>
     5 #include<stdio.h>
     6 int main(void )
     7 {
     8    int fd = -1,i;
     9    ssize_t size = -1;
    10    char buf[10];
    11    char filenema[]="test.txt";
    12    
    13    fd = open(filename,O_RDONLY);
    14    if(fd == -1)
    15       printf("文件 %s 打开失败!,fd: %d\n",filename,fd);
    16    else
    17       printf("文件 %s 打开成功!,fd: %d\n",filename,fd);
    18    while(size){
    19       size =read(fd,buf,0);
    20       if(size == -1)
    21       {
    22          close(fd);printf("文件读取失败!\n");
    23       }  else{
    24          if(size > 0){
    25             printf("read %ld bytes:",size);
    26             for(i = 0;i<size;i++) printf("%c",*(buf+i));
    27             printf("\n");  
    28          }else printf("到达文件末尾\n");
    29       }
    30    }
    31 close(size);
    32 return 0;
    33 }

      四、写文件write()函数

      write()函数向打开的文件中写入数据,将用户的数据保存到文件中。与read()函数的含义相似,write()函数向文件描述符fd写入数据,数据的大小由count指定,buf为要写如数据的指针,write()函数返回值为成功写入数据的字节数。当文件写入失败时,该函数会返回-1。

      write()函数的原型:

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

      write()函数例子:

     1 #include<sys/types.h>
     2 #include<sys/stat.h>
     3 #include<fcntl.h>
     4 #include<string.h>
     5 #include<stdio.h>
     6 #include<unistd.h>
     7 int main(void)
     8 {
     9    int fd = -1;
    10    ssize_t size = -1;
    11    char buf[]="quick brown fox jump over the lazy dog";
    12    char filename[]="test.txt";
    13 
    14    fd = open(filename,O_RDWR);
    15    if(-1==fd)
    16       printf("文件 %s 打开失败,fd:%d\n",filename,fd);
    17    else 
    18       printf("文件 %s 打开成功,fd:%d\n",filename,fd);
    19    size = write(fd,buf,strlen(buf));
    20    printf("写入%ld个字节到文件 %s 中\n",size,filename);
    21 close(fd);
    22 return 0;
    23 }

     

  • 相关阅读:
    -bash: fork: Cannot allocate memory 问题的处理
    Docker top 命令
    docker常见问题修复方法
    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
    What's the difference between encoding and charset?
    hexcode of é î Latin-1 Supplement
    炉石Advanced rulebook
    炉石bug反馈
    Sidecar pattern
    SQL JOIN
  • 原文地址:https://www.cnblogs.com/zhy128/p/6126711.html
Copyright © 2011-2022 走看看