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 }

 

 

 

posted @ 2016-12-02 19:27  QuiryRain  阅读(1097)  评论(0编辑  收藏  举报