Linux中文件调用实现对文件的操作(文件描述符)

Linux中系统调用实现对文件的操作(文件描述符)

内容:设计一个程序,将文件a的内容复制到b中去使得b的内容与a中内容相同。将a中的内容追加到c文件中。
注意:需要考虑到a、 b、c不存在,b中有原始数据等问题

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
int main(){
      int fd,fd1,fd2;
      int num=0;
      char buf[1024];
      if((fd=open("a",O_CREAT|O_RDONLY,777))>0)
      {
        if ((fd1=open("b",O_RDWR|O_CREAT|O_TRUNC,777))>0)
         {

             while((num=read(fd,buf,sizeof(buf)))>0)
             {
               if(write(fd1,buf,num)!=num)
                {
                   printf("write file b error\n");
                }          
             }
         }
         else
              printf("into file b error");
         
         if((fd2=open("c",O_CREAT|O_WRONLY|O_APPEND,777))>0)
         {
           if((lseek(fd,50,SEEK_END))!=-1)
           {
             while((num=read(fd,buf,sizeof(buf)))>0)
              {
                if(write(fd2,buf,num)!=num)
                {
                  printf("appwrite file c error\n");
                }
              }
           }
           else
               printf("read file a and write into file c error\n");
         }
         else
             printf("into file c error\n");  
      }
      else
           printf("into file c  error\n");
     close(fd);
     close(fd1);
     close(fd2);       
   return 0;
}   

上面内容是采用Linxu中的文件I/O调用来实现的,Linux中文件I/O调用提供的是底层服务,底层的服务不提供缓冲,而直接进入操作系统,当然本例可以采用C语言中的标准I/O库里的库函数通过流来实现,在此不再赘述(有意者可以评论,看见会回复)

注意事项:

本例的关键问题是进行对文件c的追加写时文件a的指针位置,由于一开始是对文件b进行的拷贝,此是文件a的指针是指向末尾的,所以对文件c进行操作时,应注意对文件a中的指针从新指向文件起使位置。
在这里我采用Lseek函数。
有关Lessk函数的相关概念

在此我借鉴这篇回答:关于Lessk函数的几个相关实例

内容

Linux的lseek函数用来控制一个打开的文件的读写位置,它的函数原型如下:
off_t lseek(int fildes,off_t offset ,int whence);
参数的用法:fildes参数为一个已打开的文件描述符;参数offset为读写位置的位移数,这个位移数是根据参数whence来确定的;whence参数分为下列三种:
SEEK_SET:表示offset用来直接设置读写位置。
SEEK_CUR:表示以目前的读写位置往后增加offset个位移量。
SEEK_END:表示将读写位置指向文件尾后再增加offset个位移量。
当whence值为SEEK_CUR或SEEK_END时,参数offet允许负值出现。当lseek调用成功时返回目前的读写位置,也就是距离文件开头多少个字节。若有错误则返回-1,errno会存放错误代码。下面是几个使用示例:
将读写位置移到文件开头:lseek(myfile, 0, SEEK_SET);
将读写位置移到文件尾:lseek(myfile, 0, SEEK_END);
想要取得目前文件位置:off_t cur=lseek(myfile, 0, SEEK_CUR);

注意:使用lseek函数需要包含以下头文件:
#include <sys/types.h>
#include <unistd.h>

如有不足之处,请大家指出,谢谢!!!

猜你喜欢

转载自blog.csdn.net/HG0724/article/details/101224237