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>
如有不足之处,请大家指出,谢谢!!!