文件I/O操作(2)
lseek函数原型为int lseek(int fd,int offset, int whence),fd为定位文件的描述符,offset为偏移量,如果是正数,则向文件末尾偏移,负数时,则向文件头偏移,但是不能超出文件的范围,whence为参考点,
SEEK_SET为文件头,SEEK_END为文件末尾,SEEK_CUR为文件当前操作位置返回值为操作后文件操作位置对文件头的偏移量,如果需要计算文件大小时,可以把文件操作位置移动到文件末尾,返回值即为文件的大小(字节数)
需要注意,求文件长度时把文件的操作位置移动到文件末尾,这时要在进行操作,需要把文件操作位置移回到文件头
现在可以来做一题目:解析/etc/passwd这个文件,把ect下面的用户名解析出来,并且写入另外一个文件中
这里涉及一个算法,观察每一行,会发现,我们需要的东西是冒号前面的字符,所以可以调用strchr这个函数来进行查找,strchr()这个函数的函数原型是char * strchr(const char *s,int c);返回值是函数操作的指针,这里要注意,int c是四个字节,足够容纳一个字符串,这里是继承unix的函数的接口,所以这个(笔者想,这也许可以用来制造计算机病毒,因为char是一个字节,还有三个字节可以用,如果调用strchr()函数时设计一个后门,是程序运行到strchr函数,查找其他三个字节,进而跳转到自己写的汇编代码~~笔者功力不足,但自觉告诉我这种方法可行)
回到正题,利用strchr查找到之后,指针指向冒号,将冒号改为'\0',再用printf("%s")进行打印即可
代码示例代码
include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h> int main(void)
{
int fd1,fd2,size,f1,f2,len;
char *buf,*tem,*con; fd1 = open("/etc/passwd",O_RDONLY); if(fd1<0)
{
printf("openfile fail\n");
return -1;
} fd2 = open("test2",O_WRONLY|O_CREAT|O_APPEND,777);
if(fd2<0)
{
printf("create test2 fail\n");
return -1;
} len = lseek(fd1,0,SEEK_END);
lseek(fd1,0,SEEK_SET); buf = (char *)malloc(len);
if(buf==NULL)
{
printf("malloc fail\n");
return -1;
} memset(buf,0,len); size = read(fd1,buf,len);
if(size <0)
{
printf("read fail\n");
return -1;
} tem = buf;
while(1)
{
con = strchr(tem,':');//查找字符串
if(con!=NULL) //字符串找到了
{
*con = '\n'; //将该处设为回车
*(con+1)='\0';//将该处设为打印时的断点 f1 = write(fd2,tem,strlen(tem));//写入文件
if(f1 <0)
{
printf("write fail\n");
return -1;
} tem = con+2;
con = strchr(tem,'\n');
if(con !=NULL)
{
tem = con +1; }
else
{
break;
}
}
else
{
break;
}
}
close(fd1);
close(fd2);
free(buf); return 0;
}
注意这里写入文件test2编译可以执行,但是不能执行第二次,原因是没有权限,所以要调用命令chmod 777 text2将文件的权限全部打开,才能重复执行代码,这里调用的lseek函数用来计算文件的总长度,返回值即是文件的长度,在调用malloc()分配相应的字节数,这样就可以一次性读完了文件,而不用重复读写,这种方法虽然能够提高代码运行的速度,但是在大文件的时候,文件可能太大,会占用过多的系统资源,所以,读取文件要进行适当的选择,但是一般是都一次性读取
例2:读取该文件中间五十个字节:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h> int main(void)
{
int fd1,fd2,size,mid,slen;
char *buf; fd1 = open("/etc/passwd",O_RDONLY);
if(fd1 < 0)
{
printf("open fail\n");
return -1;
} fd2 = open("chazao",O_CREAT|O_RDWR,777);
if(fd2 < 0)
{
printf("open fail\n");
return -1;
} fd2 = open("chazao",O_CREAT|O_RDWR,777);
if(fd2 < 0)
{
printf("create chazao fail\n");
return -1;
} size = lseek(fd1,0,SEEK_END);
mid = size/2;
lseek(fd1,-(mid+25),SEEK_END);//这里负号表示向文件头偏注意一定是负号 buf = (char *)malloc(50);
if(buf ==NULL)
{
printf("malloc fail\n");
return -1;
}
版权所有,转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3304046.html
文件I/O操作(2)的更多相关文章
- 用 JSP 实现对文件的相关操作
前段时间一直忙着作业,实验,动手的时间真是少之又少,今天终于可以继续和大家分享关于 JSP 的学习心得. 简单总结一下吧: JSP 理论性很强,感觉就是纯语法. 我更偏向于实际编写代码,这样更容易理解 ...
- PHP文件相关的操作函数——目录操作
1.有关文件类型的函数 PHP是以UNIX的文件系统为模型的,因此在Windows系统中我们只能获得“file”.“dir”或者“unknown”三种文件类型.而在UNIX系统中,我们可以获得“blo ...
- C#对文件/目录的操作:Path、File、Directory、FileStream、StreamReader、StreamWriter等类的浅析
以下类的命名空间都是:System.I/0; 一.Path:主要对文件路径的操作! 常用方法: String path=@"C:\a\b\c\123.txt"; 1-1.Path. ...
- 无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问。)” (Microsoft SQL Server,错误: 5120)的解决方法
无法打开物理文件xxx.mdf操作系统错误 5:“5(拒绝访问.)” (Microsoft SQL Server,错误: 5120)的解决方法 问题描述: 在附加数据库到sql server时,附 ...
- java io流 对文件夹的操作
java io流 对文件夹的操作 检查文件夹是否存在 显示文件夹下面的文件 ....更多方法参考 http://www.cnblogs.com/phpyangbo/p/5965781.html ,与文 ...
- php对xml文件进行CURD操作
XML是一种数据存储.交换.表达的标准: - 存储:优势在于半结构化,可以自定义schema,相比关系型二维表,不用遵循第一范式(可以有嵌套关系): - 交换:可以通过schema实现异构数据集成: ...
- 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】
一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...
- Python::OS 模块 -- 文件和目录操作
os模块的简介参看 Python::OS 模块 -- 简介 os模块的进程管理 Python::OS 模块 -- 进程管理 os模块的进程参数 Python::OS 模块 -- 进程参数 os模块中包 ...
- INI 文件的读写操作
在C#中对INI文件进行读写操作,在此要引入using System.Runtime.InteropServices; 命名空间,具体方法如下: #region 变量 private static r ...
- Android 对 properties文件的读写操作
-. 放在res中的properties文件的读取,例如对放在assets目录中的setting.properties的读取:PS:之所以这里只是有读取操作,而没有写的操作,是因为我发现不能对res下 ...
随机推荐
- IIS (HTTP Error 500.21 - Internal Server Error)解决
今天在测试网站的时候,在浏览器中输入http://localhost/时,发生如下错误: HTTP Error 500.21 - Internal Server Error Handler " ...
- 3123 高精度练习之超大整数乘法 - Wikioi
题目描述 Description 给出两个正整数A和B,计算A*B的值.保证A和B的位数不超过100000位. 输入描述 Input Description 读入两个用空格隔开的正整数 输出描述 Ou ...
- 3.9 spring-自定义标签解析
到这里,我们已经完成了分析默认标签的解析与提取过程,或许设计的内容太多,我们忘了我们是冲哪个函数开始了的, 让我们再次回顾一下默认标签解析方法的起始方法. 入口如下: /** * Parse the ...
- ExtJS4.2学习(九)属性表格控件PropertyGrid(转)
鸣谢网址:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-15/178.html ------------- ...
- asp.net中js和jquery调用ashx的不同方法分享
代码如下: var xhr = new XMLHttpRequest(); xhr.open("get", 'Controls/gengCart.ashx?C ...
- 关于hibernate中双向外键关联one-to-one的property-ref=的问题(转)
大家都知道hibernate中的one-to-one映射主要有两种策略,(1)一对一主键关联(单向和双向).(2)一对一外键映射(单项和双向).本文主要讲解一下,一对一外键映射中的双向问题,在此前先通 ...
- 接口和JAVA设计模式
- linux grep和正则表达式
虽然正则表达式经常都在用,但是很少能够静下心来仔细的总结一下.最近看了一个台湾人的网站叫做鸟哥Linux私房菜,关于正则表达式的描述挺详细的.在此,我进行一下总结,如果想仔细的学习正则表达式,请访问鸟 ...
- 非常好的Demo网站
http://www.xdemo.org/
- 使用头文件climits中的符号常量获知整型数据的表数范围---gyy整理
在头文件climits(limits.h)以宏定义的方式定义了各种符号常量来表示各种整型类型表示数的范围,如int的最大最小值,long的最大最小值等. 符号常量 表示 CHAR_BIT char 的 ...