快速业务通道

linux文件I/O操作

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-18
之前有介绍过关于文件的指针和描述符,这次通过一个练习,熟悉了一下文件的open,close,read,write,sleek,dup等操作,一些主要的注意事项详见代码注释吧. ps:部分代码写的有些龌龊,也和硬要把几个函数都试到有关,应该可以用更好的方法.fighting~~~ 【功能】命令行输入三个参数,将data.dat文件中的内容拷贝到data2.dat中,并搜索data2.dat中hello出现的次数,消息打印重定向到dupfile.dat中. 【代码实现】 #include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h> int main(int argc,char* argv[])
{
int fd1;
int fd2;
int fd3;
char buffer[100];
int num;
int flag = 0;
int len;
int offset = 0; if(4 != argc)
{
printf("Usage:%s source file,dest file,key word.n",argv[0]);
return 1;
}
// test function :open(),close(),read(),write() //打开文件,如果文件不存在,允许按照参数给定权限创建,这里文件data.dat为已经存在且写入一定内容的. if((fd1=open(argv[1],O_CREAT | O_RDWR,0777))==-1)
{
perror("Can''t open the source file.n");
return 1;
}
if((fd2=open(argv[2],O_CREAT | O_RDWR,0777))==-1)
{
perror("Can''t open the dest file.n");
return 1;
} while((num=read(fd1,buffer,5))>0)
{
buffer[num]=''''; //防止读出乱码影响结果
if(write(fd2,buffer,num)==-1)
{
perror("Write to file data2.dat failed.n");
return 1;
}
}
close(fd1); close(fd2);
Empire CMS,phome.net
//test function: lseek() dup()
len = strlen(argv[3]);
if((fd2=open(argv[2],O_RDONLY))==-1)
{
perror("Can''t open the dest file.n");
return 1;
} while(1)
{ //SEEK_SET参数表示每次都是直接用offset做偏移值,即在文件头的位置 offset;此外SEEK_CUR表示在当前位置基础上加offset偏移,SEEK_END表示偏移量为文件大小加offset值.
if(lseek(fd2,offset,SEEK_SET)==-1)
{
perror("Can''t move the file pointer.n");
return 1;
}
if((num=read(fd2,buffer,len))<len)
{ //可读到的字符数小于要搜索的字符串长度,可以跳出
break;
}
else
{
buffer[len]='''';
if(strcmp(buffer,argv[3])==0)
{ //找到匹配,计数 1
flag ;
} //无论是否匹配,offset都应该增加1,否则文件指针一直不变,进入死循环
offset ;
}
} //关闭标准输出,并将打开的文件描述符重定向到标准输出
close(STDOUT_FILENO);
if((fd3=open("dupfile.dat",O_CREAT | O_RDWR,0777))==-1)
{
perror("Can''t creat the dup file.n");
return 1;
}
if(dup(fd3)==-1)
{
perror("Can''t reserved the std out fd.n");
return 1;
}
if(flag>0)
{ //printf打印的内容实际上已经重定向到dupfile.dat中了
printf("Find the string %s in file %s %d times.n",argv[3],argv[2],flag);
}
close(fd2);
return 0;
}
【运行结果】 gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ gcc -o file file.c
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ ./file data.dat data2.dat hello //带3个参数执行
gaolu@gaolu-desktop:~$ gaolu@gaolu-desktop:~$
Empire CMS,phome.net

gaolu@gaolu-desktop:~$ cat data.dat
hellohellohellohellohellohellohellohe
gaolu@gaolu-desktop:~$ cat data2.dat //从data.dat中拷贝的内容
hellohellohellohellohellohellohellohe
gaolu@gaolu-desktop:~$ cat dupfile.dat //打印hello出现7次重定向到dupfile.dat
Find the string hello in file data2.dat 7 times.
gaolu@gaolu-desktop:~$

Empire CMS,phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号