范文一:使用内存映射的例子
在一个文本文件里搜索指定的字符串所在的行,并打印.
19 #include 20 #include 21 #include 22 #include 23 #include 24 #include 25 #include 26 #include 27 #include 28 29 #define LINE 1024 30 31 extern int errno; 32 33 char *key = NULL; 34 char *area = NULL; 35 36 static void 37 search_in_file(int fd,unsigned long size); 38 39 static void 40 usage(){ 41 printf("usage: get_line file keyword "); 42 exit(0); 43 } 44 45 static void 46 my_output(char *str){ 47 (void)printf("%s ",str); 48 (void)fflush(NULL); 49 } 50 51 int 52 main(int argc,char **argv){ 53 int i,c,fd; 54 long prio; 55 char *ptr = NULL; 56 struct stat sb; 57 58 char *buf = malloc(sizeof(char)*LINE); 59 key = malloc(sizeof(char)*LINE); 60 61 if(argc <> 62 usage(); 63 64 /* if the keyword contains space,all right */ 65 (void)strcpy(key,argv[2]); 66 for(i = 3;i < argc;++i){=""> 67 (void)sprintf(buf," %s",argv[i]); 68 (void)strcat(key,buf); 69 } 70 free(buf); 71 area = argv[1]; 72 73 if(lstat(area,&sb) < 0){=""> 74 (void)printf("Stat %s failed: %s",area,strerror(errno)); 75 exit(1); 76 } 77 78 if(S_ISREG(sb.st_mode)) 79 if((fd = open(area,O_RDONLY)) < 0){=""> 80 (void)printf("Open %s failed: %s",area,strerror(errno)); 81 exit(1); 82 } 83 search_in_file(fd,sb.st_size); 84 85 exit(0); 86 } 87 88 /* find keyword text in text file */ 89 static void 90 search_in_file(int fd,unsigned long size){ 91 int n=1,i; 92 char *key_ptr,*mm_ptr,*line_ptr,*ptr; 93 char *line = malloc(sizeof(char)*10); 94 char *str_output = malloc(sizeof(char)*LINE); 95 96 mm_ptr = mmap(NULL,size,PROT_READ,MAP_PRIVATE,fd,0); 97 (void)close(fd); 98 ptr = mm_ptr; 99 while((key_ptr = strstr(ptr,key)) != NULL){ 100 memset(str_output,0,LINE); 101 for(;ptr<=key_ptr;ptr++)>=key_ptr;ptr++)> 102 if((*ptr == ' ') || (*ptr == ' ') || (*ptr == 0x85)){ 103 ++n; /* count the line number */ 104 line_ptr = ptr+1; 105 } 106 /* count the line length */ 107 for(i = 0,ptr = line_ptr;(*ptr != ' ')&&(*ptr != ' ')&&(*ptr != 0x85);ptr++) 108 ++i; 109 i = ((i>128)?128:i); 110 (void)sprintf(line,"%5d: ",n); 111 (void)strcpy(str_output,line);/* for print line number */ 112 (void)strncat(str_output,line_ptr,i);/* for print the line */ 113 my_output(str_output); 114 ptr = key_ptr+1; /* search in the next string */ 115 } 116 free(line); 117 (void)munmap(mm_ptr,size); 118 } HC映射的一个简单例子 本文由疯狂Java培训为你整理 建立一个相关的数据库表: [sql] create table c_user( id int(11) not null auto_increment, age int(11) default null, firstname varchar(50) default null, lastname varchar(50) default null, address varchar(200) default null, zipcode varchar(10) default null, tel varchar(20) default null, primary key(id) )engine=innodb default charset=utf-8; 注解:该表是一个用户信息表,可以将用户信息归纳为两个部分:一个部分是name(姓名),包含firstname(姓)和lastname(名);另一部分是contact(联系方式),包括了address(地址)、zipcode(邮编)和tel(电话)等信息。在创建实体类时,可以将name和contact分别封装到2个独立的类中,这样就提高了系统的复用性和灵活性。也就是说,需要使用Component映射,将其他的实体类映射在一起。 建立一个Name.java类: [java] package collect.component; import java.io.Serializable; public class Name implements Serializable { private String firstname; private String lastname; public String getFirstname() { return firstname; } public void setFirstname(String firstname) { this.firstname = firstname; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } } 建立联系方式相关的类Contact.java: [java] package collect.component; import java.io.Serializable; public class Contact implements Serializable{ private String address; private String zipcodes; private String tel; public Contact() {} public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getZipcodes() { return zipcodes; } public void setZipcodes(String zipcodes) { this.zipcodes = zipcodes; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } 疯狂软件学院教师团队技术深厚,老师都是项目经理,技术总监,部分老师还是疯狂Java体系图书作者。疯狂Java老师让学员充分感受Java的魅力,充分激发每个学员对于编程的热爱,让你在半年时间掌握将近8-10万的代码量,达到技术经理的代码掌握量,让你迅速成为企业梦寐以求的Java人才。疯狂Java培训,是你走进名企的保障,成就你高薪梦想。 void test() { // 创建文件内核对象,其句柄保存于hFile HANDLE hFile = CreateFile( "test.zip", //要打开文件的名字 GENERIC_WRITE | GENERIC_READ, //应用程序对文件进行何种操作 0, //零表示不共享 其他进程不可以同时操作此文件 NULL, //文件安全属性,一般置为NULL OPEN_ALWAYS, //文件存在就读取,不存在就创建一个 FILE_ATTRIBUTE_NORMAL, //默认文件属性 隐藏还是只读 NULL); //不复制扩展名 DWORD dwBytesInBlock = GetFileSize(hFile,NULL); //文件长度 // 创建文件映射内核对象,句柄保存于hFileMapping HANDLE hFileMapping = CreateFileMapping( hFile, //待映射到进程地址空间的文件句柄 NULL, //句柄不能被继承 PAGE_READWRITE, //指定文件映射对象的页面保护 0, //指定了文件的最大字节数 高位 dwBytesInBlock, //指定了文件的最大字节数 低位 NULL); //该文件映射对象的名称 // 释放文件内核对象 CloseHandle(hFile); // 设定大小、偏移量等参数 __int64 qwFileOffset = 0; // 将文件数据映射到进程的地址空间 byte * pbFile = (byte *)MapViewOfFile( hFileMapping, //CreateFileMapping()返回的文件映像对象句柄 FILE_MAP_ALL_ACCESS, //对文件数据的访问方式 (DWORD)(qwFileOffset>>32), //文件的偏移地址 高位 (DWORD)(qwFileOffset&0xFFFFFFFF), //文件的偏移地址 低位 dwBytesInBlock); //待映射的长度 不能大于文件长度 没有用, //////////////测试部分 // byte a[20]; //memcpy(a,pbFile,20); memcpy(pbFile,"MMMM",4); // memcpy(pbFile+5,"PPPP",4); //memcpy(a,pbFile,10); //////////////释放 句柄 UnmapViewOfFile(pbFile); CloseHandle(hFileMapping); // printf("%s \n",a); } 2008-10-10 hibernate复合主键 方法1 基于业务需求,您会需要使用两个字段来作复合主键,例如在User数据表中,您也许会使用"name"与"phone"两个字段来定义复合主键。 假设您这么建立User表格: CREATE TABLE user ( name VARCHAR(100) NOT NULL, phone VARCHAR(50) NOT NULL, age INT, PRIMARY KEY(name, phone) ); 在表格中,"name"与"age"被定义为复合主键,在映像时,您可以让User类别直接带有"name"与"age"这两个属性,而Hibernate要求复合主键类别要实作Serializable接口,并定义equals()与hashCode()方法: User.java package onlyfun.caterpillar; import java.io.Serializable; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; // 复合主键类的对应类别必须实作Serializable接口 public class User implements Serializable { private String name; private String phone; private Integer age; public User() { } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } // 必须重新定义equals()与hashCode() public boolean equals(Object obj) { if(obj == this) { return true; } if(!(obj instanceof User)) { return false; } User user = (User) obj; return new EqualsBuilder() .append(this.name, user.getName()) .append(this.phone, user.getPhone()) .isEquals(); } public int hashCode() { return new HashCodeBuilder() .append(this.name) .append(this.phone) .toHashCode(); } } equals()与hashCode()方法被用作两笔不同数据的识别依据;接着您可以使用 <?xml version="1.0" encoding="utf-8"?> PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> column="name" type="java.lang.String"/> column="phone" type="java.lang.String"/> 在储存数据方面,复合主键的储存没什么区别,现在的问题在于如何依据复合主 键来查询数据,例如使用load()方法,您可以创建一个User实例,并设定复合 主键对应的属性,接着再透过load()查询对应的数据,例如: User user = new User(); user.setName("bush"); user.setPhone("0970123456"); Session session = sessionFactory.openSession(); // 以实例设定复合主键并加载对应的数据 user = (User) session.load(User.class, user); System.out.println(user.getAge() + "\t" + user.getName() + "\t" + user.getPhone()); session.close(); 方法二 可以将主键的信息独立为一个类别,例如: UserPK.java package onlyfun.caterpillar; import java.io.Serializable; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; public class UserPK implements Serializable { private String name; private String phone; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public boolean equals(Object obj) { if(obj == this) { return true; } if(!(obj instanceof User)) { return false; } UserPK pk = (UserPK) obj; return new EqualsBuilder() .append(this.name, pk.getName()) .append(this.phone, pk.getPhone()) .isEquals(); } public int hashCode() { return new HashCodeBuilder() .append(this.name) .append(this.phone) .toHashCode(); } } 现在User类别的主键信息被分离出来了,例如: User.java package onlyfun.caterpillar; import java.io.Serializable; public class User implements Serializable { private UserPK userPK; // 主键 private Integer age; public User() { } public UserPK getUserPK() { return userPK; } public void setUserPK(UserPK userPK) { this.userPK = userPK; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } 在映像文件方面,需要指定主键类的信息,例如: User.hbm.xml <?xml version="1.0" encoding="utf-8"?> PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> class="onlyfun.caterpillar.UserPK" unsaved-value="any"> column="name" type="java.lang.String"/> column="phone" type="java.lang.String"/> 在查询数据时,必须指定主键信息,例如: UserPK pk = new UserPK(); pk.setName("bush"); pk.setPhone("0970123456"); Session session = sessionFactory.openSession(); // 以主键类实例设定复合主键并加载对应的数据 User user = (User) session.load(User.class, pk); System.out.println(user.getAge() + "\t" + user.getUserPK().getName() + "\t" + user.getUserPK().getPhone()); session.close(); 1.2.4 映射、复合函数 【学习目标】 1. 能举例说明映射的意义和f (g (x )) 的意义,能判定一个对应是否是映射,知道映射 与函数的区别于联系;2. 会求一次型、二次型、分式型复合函数的解析式、函数值和定义域; 3. 通过对数学符号的理解,提升抽象思维能力. 【学习重点】 求一次型、二次型、分式型复合函数的解析式、函数值和定义域. 【难点提示】映射、复合函数的概念的理解,解答有关复合函数的问题 【学法提示】1. 请同学们课前将学案与教材P 15-16结合进行自主学习(对教材中的文字、 图象、表格、符号、观察、思考、说明与注释、例题及解答、阅读与思考、小结等都要仔细 阅读)、小组讨论,积极思考提出更多、更好、更深刻的问题,为课堂学习做好充分的准备; 2. 在学习过程中用好“九字学习法”即:“读”、“挖”、“举”、“联”、“用”、“悟”、“总”、 “研”、“会”,请在课堂上敢于提问、敢于质疑、敢于讲解与表达. 【学习过程】 一、学习准备 1. 请同学们回顾函数的概念是怎样的?并大胆的想象,若将函数概念中的数集A 、B 换 成任意的两个非空集合,这样的对应有意义吗?在生活中有这样的例子吗? 2. 预备练习 请完成下列填空: (1)若f (x ) =3x -1,那么f (3) , f (3a +1) = ,其求解过程体现 了怎样的方法?(链接1) (2)已知函数y =f (u ) =3u + 1,u =g (x ) =,那么函数 y =f (g (x )) =; (3)已知函数y =f (u ) =3u +1,u =g (x ) =x +1,那么函数 x y =f (g (x )) = 二、探究新知 1.映射的概念 阅读思考 请同学们教材P 22-23的内容,思考: (1)映射概念中的关键词有哪些?构成从集合A 到B 的映射同时需要几个条件? (2)映射与函数有哪些异同点?又有怎样的关系?(链接2) (3)教材中的例7是什么题型?你看懂了吗?能灵活运用其解法求解类似问题吗? 快乐体验 1.请回答教材P 23的 “思考”和练习的第4题提问; 2, f :(x , y ) →x +y 2. 已知集合A ={(x , y ) |x +y <3, x="" ∈n="" ,="" y="" ∈n="" ,则},="" b="{0,1,">3,> 这个对应是否为映射?是否为函数?请说明理由. 2. 复合函数的概念 (1)观察思考 观察学习准备“2”中的三个问题的求解过程,思考以下问题. ①y =f (g (x )) 是通过怎样的代换得到的? ②y =f (u ) 的定义域B 与u =g (x ) 的值域C 有什么关系?(链接3) (2)归纳概括 ①通过以上的观察思考,请用一句话来表述函数y =f (g (x )) 的形成过程 ; ②你能由此可以得出复合函数的概念吗?请试一试?(链接4) ● 想一想: (1)为什么一定要有C ?B ? (2)体会函数y =f (g (x )) 形成过程;函数y =f (g (x )) 的定义域如何求得? 三、典例赏析 例1(1)已知f (x ) =x +1,求f (f (2)),f (f (x )) . (2)已知f (x ) 是一次函数,且f (f (x )) =x +1,则f (x ) = . 思路启迪:运用代入法,通过代换形成y =f (g (x )) 的过程. 解: ●解后反思 求解此类问题的关键是什么? 变式练习 已知函数f (x ) =2x -1,则方程f (4x ) =x 的根为( ) x 11A .-2 B .2 C .- D . 22 2例2. 已知函数y =f (x ) 定义域为[-1, 4],求f (x ) 的定义域. ●思路启迪:已知[-1, 4]是哪个变量的范围,f (x ) 与f (x ) 的联系在哪里?抓住2 f (x 2) 与f (x ) 的自变量的关系便迎刃而解. 解: ●解后反思 求函数定义域就是求什么变量的取值范围?求解该题的关键在哪里?范文二:HC映射的一个简单例子
范文三:内存映射例子
范文四:hibernate复合主键的例子
范文五:映射、复合函数学案