Linux系统下文件的通用操作方法

2016-12-02 19:52:49来源:cnblogs.com作者:Quiry人点击

      每一个系统下都有对文件操作的应用,但是都大致相同,同样在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    else17       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 }

 

 

 

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台