啤酒

一个空白者

 

2007年4月24日

国家重点实验室名单


国家重点实验室名单




 

中国科学院

模式识别实验室

自动化研究所
金属材料疲劳与断裂实验室 金属研究所
传感技术联合实验室   电子所、冶金所、半导体所等
超导实验室 物理所
红外物理实验室 上海技术物理研究所
生物大分子实验室 生物物理研究所
大气数值模拟实验室 大气物理研究所
波谱与原子分子物理实验室 武汉物理研究所
分子反应动力学实验室 大连化学物理研究所、化学所
腐蚀科学实验室 金属腐蚀与防护研究所
科学与工程计算实验室 计算数学与科学工程计算所
信息功能材料实验室 上海冶金所
植物细胞与染色体工程实验室 遗传所
黄土高原土壤侵蚀与旱地农业实验室 西北水土保持所
农业虫害鼠害综合治理实验室 动物所
煤炭转化实验室 山西煤化所
火灾科学实验室 中国科技大学
瞬态光学技术实验室 西安光机所
生化工程实验室 化冶所
微生物资源前期开发实验室 微生物所
微细加工光学技术实验室 光电技术所
工程塑料实验室 化学所
半导体超晶格实验室 半导体研究所
快速凝固非平衡合金实验室 金属研究所
声场与声信息实验室 声学研究所
淡水生态与生物技术实验室 水生生物研究所
羰基合成和选择氧化实验室 兰州化物所
大气边界层物理和化学实验室 大气所
分子动态与稳态结构实验室 化学研究所、北大
催化基础实验室 大连化学物理研究所
高性能陶瓷和超微结构实验室 上海硅酸盐研究所
计划生育生殖生物学实验室 动物研究所
表面物理实验室 物理研究所、半导体所
植物分子遗传实验室 上海植物生理研究所
分子生物学实验室 上海生物化学研究所
生命有机化学实验室 上海有机化学研究所
气体地球化学实验室 兰州地质研究所
有机地球化学实验室 广州地球化学研究所
资源与环境信息系统实验室 地理研究所
新药研究实验室 上海药物研究所
结构化学实验室 福建物质结构研究所
冻土工程实验室 兰州冰川冻土研究所
 

教育部

集成光电子学实验室 清华、吉大、半导体研究所
化学工程联合实验室 清华、天大、华东理工大学、浙大
煤的燃烧实验室 华中理工大学
毫米波实验室 东南大学
应用表面物理实验室 复旦大学
材料复合新技术实验室 武汉工业大学
高分子材料工程实验室 四川联合大学
晶体材料实验室 山东大学
计算机辅助设计与图行学实验室 浙江大学
配位化学实验室 南京大学
土木工程防灾实验室 同济大学
固体微结构物理实验室 南京大学
固体表面物理化学实验室 厦门大学
智能技术与系统实验室 清华大学
内生金属矿床成矿机制研究实验室 南京大学
暴雨监测和预测实验室 北京大学
医药生物技术实验室 南京大学
污染控制和资源化研究实验室 同济大学、南京大学
生物反应器实验室 华东化工学院
微生物技术实验室 山东大学
生物防治实验室 中山大学
河口海岸动力沉积和动力地貌综合实验室 华东师范大学
干旱农业生态实验室 兰州大学
粉末冶金实验室 中南工业大学
新型陶瓷与精细工艺实验室 清华大学
凝固技术实验室 西北工业大学
新金属材料实验室 北京科技大学
超硬材料实验室 吉林大学
理论化学计算实验室 吉林大学
吸咐分离功能高分子材料实验室 南开大学
染料、表面活性剂精细化工合成实验室 大连理工大学
重质油加工实验室 石油大学
稀土材料化学及应用实验室 北京大学
近代声学实验室 南京大学
流体传动及控制实验室 浙江大学
制浆造纸工程实验室 华南理工大学
纤维材料改性实验室 中国纺织大学
混凝土材料研究实验室 同济大学
软件开发环境实验室 北京航空航天大学
现代光学仪器实验室 浙江大学
精密测试技术及仪器实验室 天津大学、清华大学
文字信息处理技术实验室 北京大学
微波与数字通信技术实验室 清华大学
程控交换技术与通信网实验室 北京邮电大学
移动与多点无线电通信系统实验室 东南大学
区域光纤通信与相干光纤通信实验室 北京大学、上海交通大学
综合业务网理论及关健技术实验室 西安电子科技大学
专用集成电路与系统实验室 复旦大学
宽带光纤传输与通信系统技术实验室 (成都)电子科技大学
电力系统及大型发电设备安全实验室 清华大学
牵引动力实验室 西南交通大学
现代焊接生产技术实验室 哈尔滨工业大学
工业控制技术实验室 浙江大学
汽车安全与节能实验室 清华大学
振动冲击噪声实验室 上海交通大学
电力设备电气绝缘实骏室 西安交通大学
工业装备结构分析实验室 大连理工大学
塑性成形模拟及模具技术实验室 华中理工大学
轧制技术及连轧自动化实验室 东北大学
汽车动态摸拟实验室 吉林工业大学
机械制造系统工程实验室 西安交通大学
爆炸灾害预防、控制实验室 北京理工大学
生物膜与膜生物工程实验室 清华、北大、动物所
海洋工程实验室 上海交通大学
人工微结构和介观物理实验室 北京大学
遗传工程实验室 复旦大学
视觉听觉信息处理实验室 北京大学
元素有机化学实验室 南开大学
应用有机化学实验室 兰州大学
海岸和近海工程实验室 大连理工大学
蛋白质工程及植物基因工程实验室 北京大学
激光技术实验室 华中理工大学
煤的清洁燃烧技术实验室 清华大学
计算机软件新技术实验室 南京大学
机械传动实验室 重庆大学
动力工程多相流实验室 西安交通大学
硅材料科学实验室 浙江大学
磨擦学实验室 清华大学
机械结构强度与振动实验室 西安交通大学
金属材料强度实验室 西安交通大学
金属基复合材料实验室 上海交通大学
高速水力学实验室 成都科技大学
超快速激光光谱实验室 中山大学
 

农业部

作物遗传改良实验室 华中农业大学
农业生物技术实验室 北京农业大学
植物病虫害生物学实验室 中国农科院植保所
兽医生物技术实验室 农科院哈尔滨兽医所
热带作物生物技术实验室 华南热作两院
 

卫生部

病毒基因工程实验室 预防医科院病毒所
天然药物及仿生药物实验室 北京医科大学
医学遗传学实验室 湖南医科大学
癌基因及相关基因实验室 上海市肿瘤所
分子肿瘤学实验室 医科院肿瘤所
医学神经生物学实验室 上海医科大学
医学分子生物学实验室 医科院基础所
计划生育药具实验室 上海计划生育研究所
实验血液学实验室 医科院血液所
 

国家测绘局

测绘遥感信息工程实验室 武汉测绘科技大学

posted @ 2007-04-24 19:04 啤酒 阅读(967) | 评论 (0)编辑 收藏

2002-2004年国内80个一级学科高校排名(4)

     摘要: 0803  光学工程   学位授予单位名称 整体水平 分项指标 ...  阅读全文

posted @ 2007-04-24 18:42 啤酒 阅读(373) | 评论 (0)编辑 收藏

2002-2004年国内80个一级学科高校排名(3)

     摘要: 0802 机械工程   学位授予单位代码及名称 整体水平 分项指标 ...  阅读全文

posted @ 2007-04-24 18:39 啤酒 阅读(540) | 评论 (0)编辑 收藏

2002-2004年国内80个一级学科高校排名(2)

     摘要: 0704 天文学   学位授予单位名称 整体水平 分项指标 ...  阅读全文

posted @ 2007-04-24 18:34 啤酒 阅读(325) | 评论 (0)编辑 收藏

2002-2004年国内80个一级学科高校排名(1)

     摘要: 0101 哲学   学位授予单位名称 整体水平 分项指标 ...  阅读全文

posted @ 2007-04-24 18:30 啤酒 阅读(310) | 评论 (0)编辑 收藏

2006年国内高校一级学科排名详析

     摘要: 一级学科代码及名称:0701 数学 排名 学校代码及名称 整体水平得分 1 ...  阅读全文

posted @ 2007-04-24 18:07 啤酒 阅读(970) | 评论 (0)编辑 收藏

关于"985"

一、什么是“985工程”?

  1998年5月4日,江泽民总书记在庆祝北大建校100周年大会上向全社会宣告:“为了实现现代化,我国要有若干所具有世界先进水平的一流大学。”为贯彻落实党中央科教兴国的战略和江泽民同志的号召,教育部决定在实施“面向21世纪教育振兴行动计划”中,重点支持北京大学、清华大学等部分高等学校创建世界一流大学和高水平大学,简称“985”工程。

  二、“985”工程高校名单:

  一期名单:(34所)
  清华大学
  北京大学
  中国科技大学
  南京大学
  复旦大学
  上海交通大学
  西安交通大学
  浙江大学
  哈尔滨工业大学
  南开大学
  天津大学
  东南大学
  华中科技大学
  武汉大学
  厦门大学
  山东大学
  湖南大学
  中国海洋大学
  中南大学
  吉林大学
  北京理工大学
  大连理工大学
  北京航空航天大学
  重庆大学
  电子科技大学
  四川大学
  华南理工大学
  中山大学
  兰州大学
  东北大学
  西北工业大学
  同济大学
  北京师范大学
  中国人民大学

  二期名单:(4所)
  中国农业大学
  国防科技大学
  中央民族大学
  西北农林科技大学

posted @ 2007-04-24 17:59 啤酒 阅读(432) | 评论 (0)编辑 收藏

1959年全国首批20所重点大学是哪20个和1997年国家批准的全国首批22所“211工程”重点建设院校是哪22个?

1959年全国首批20所重点大学是哪20个和1997年国家批准的全国首批22所“211工程”重点建设院校是哪22个?

中国大学最新权威排名:
一、排行要素
1、国家重视程度(各个时期的重点大学、国家投资力度)、实验室装备、对国家的贡献
2、学术水平(论文)、学科精品度
3、师资力量(博士的比例、来自名牌大学的比例、敬业精神及精神面貌、工作业绩及在全国同类学科同行中的地位) 、博导规模及效率
4、新生入学成绩、教学质量
5、学校的文化、理念、学风、校风
6、各个不同的历史时期的状况进行加权分析---历史(权重10%)、现状(80%)和未来发展(10%)综合权衡。

二、中国的大学权威排名:
清华、北大、中科大、人大、南京大学、复旦、上交大、哈工大、浙大、西交大、*北航、*北理工、北师大、南开、同济、天大、西工大、华科、东南、大工、武大、中大、北邮、兰大、川大、吉大、山大。 (*注:北理与北航非常接近, 文字方式的排名无法并列,北航在社会上名声稍大,再加上70-90年代被贬为部属院校的二十多年北航受影响较小,就把北航放在前面吧!)

浅谈北理与北航的名气:
北理VS北航这是一个非常敏感的问题,俗话说:同行是冤家.
1、50年代--"文革"前,不相上下。北航名字响亮,北理国防尖端、延安来的学校也颇具魅力。1965年北理的招生宣传力度突然加大、一反常态、形象由神神兮兮、羞羞答答、扎根串联,变为理直气壮、大张旗鼓、牛气十足。招生简章也由一张寥寥数行文字的类草纸一下子变成了纸张特别精致、篇幅极大、内容颇具震撼力(北理直属国防部、国防科委领导)的精品。据说这一巨大变化是因为当时主持工作的主要负责人不是长期从事地下工作的魏院长而是多年带兵打仗的时*。这一下子,较大地提高了北理的影响。1965年在北京考区,北理的录取线仅低于清华、科大。据说(负责招生的老师唐**)在陕西北理也是第三名。然而好景不长,1966年6月份“文革”就开始了。
2、“文革”中,北航红旗名扬天下。
3、1972年--直至1996年恢复国防科工委院校:虽然同被流放为部属院校,但北航是航空部,北理是兵器部,航空(尽管有许多大三线厂)的牌子依然闪亮,兵器的牌子却同山沟、三线、陈旧的字眼连到了一起。据说直到现在,一些四川(因四川的三线厂太多)考生的家长一提到北理就吓的脸变色,心跳加速(*纯属神经病,现在的北理早已大大超越了兵器部的范围,尤其是市场经济的今天,你的孩子只要有本事、留北京、去上海、深圳易如反掌,甚至去美国也是不难办到的)。北理尖端、神秘的光环彻底失去了。在与北航的角逐中北理一直处于下风。幸亏北理还有国家“七五”“八五”14所重点建设大学的这块牌子,再加上地处北京,因此还不至于太狼狈。还幸亏80年代(从1983年后)冒出了个北工大,因毕业生出路好、可留北京;90年代冒出(1998年前)个北邮因专业好,在北京压着北航,使北理与北航差距没怎么拉开。尽管如此,北航的名气一直在北理之上。
4、1996年后:1996年恢复国防科工委院校,北理专业发展出现转机,经费支持也有了可靠保障,名声也好听了,北理的处境好多了。1995年第一批15所进入211工程,由中央财政厅直接拨款;2000年第十所进入985工程,成为国家重点中的重点。然而北理的名声一直在北航之下,1998年北航取代了北邮的位置。
原因有三:(1)北航改名为航空航天大学,航天是高科技、从2000年起,科技人员待遇特别高,而且航天在北京的研究院特别多。北航又擅长宣传、造舆论,因此知名度越来越高。
(2)北理在70年代--1996年的二十年中名声大损、锐气大伤、学科发展受到相当的影响,尽管实力仍然十分强劲,但北理的传统,不擅长舆论,“文革”前的导弹领头羊,北理校友群为中国航天作出重大贡献,至今连个航天学院都没有,真令人费解、莫名其妙!金牌子你不挂,究竟为何?难道你就没有意识到你的“文化”、“理念”有点落伍了么?既然这样就怪不得你的名气总在北航之下。
(3)形形色色排行榜的不良影响。1-3个人操作的形形色色的排行榜,他们中年轻者起哄、炒作、恶作剧。年长者(50几岁)为了暴利和其他更深远的目的和企图进行投机,兴风作浪、招摇撞骗、呼风唤雨、点石成金、舆论铺天盖地、大有重新造化世界、重新安排山河、当教育界太上皇的架势。这决非骇人听闻,因为他(武)的作法和他的排行榜的舆论力度早已大大超出排行榜应有的“度”,已成为世人关注的教育腐败的一个产物,成为教育界的一匹害群之马,大大损害了教育界的形象,成为教育界的一大公害。武术连的逆社会的心理障碍和极大的野心,促使他对北理痛下杀手,对北理排名过低,也一定程度上损害了北理的声誉。武术连的名言“一切从数据出发”。武术连这只过街老鼠,由于他的贪心、野心、投机、低能、弱智、不学无术,他也只能炮制出一个对大学排行的“大肚子评价体系”,这个大肚子体系本身就是反科学的,在众目睽睽下早已现出“白骨精”的原形,因此武术连的所谓数据,也只不过是贴到白骨精身上的一堆丑肉、烂肉,没有丝毫价值。乌鸦的翅膀挡不住太阳的光辉,北理正在乘第十所进入985工程(2+8)的强劲东风,发生日新月异的变化,正在为创建世界知名、国内一流高等学府而努力拼搏、重振昔日京工的辉煌指日可待。

2 中国大学最新权威排名介绍

北航与北理不该是冤家,而应是战友,是平等竞争的争创世界知名大学的国家代表队中的队友。
自1952年至2000年,中共中央、中央政府、教育部一共公布了七次"重点大学"或"重点建设首批"名单,取其交集,集中于下述十所(即"2+8"十所) 名校,他们无愧堪称为"重点中的重点"。
"2"-世界一流;"8"-世界知名,按如下顺序:
北方:清华、北大、北理工、哈工大、西交
南方:南大、复旦、上交、浙大、中科大
再加上北航、天大、南开、人大、北师大这五所,共计十五所大学组成当今中国高校的国家队。

中国的重点大学

一、六所重点大学:
1954年12月,教育部在《关于重点高等学校和专家工作范围的决议》中,指定以下6所学校为全国性重点大学: 中国人民大学、北京大学、清华大学、北京农业大学、北京医学院、哈尔滨工业大学。

二、十六所重点大学:
1959年3月22日,中共中央发出《关于在高等学校中指定一批重点学校的决定》,指定以下16所高校为全国重点大学:
北京大学、中国人民大学、清华大学、中国科技大学、北京工业学院(北京理工大学)、北京航空学院(北京航空航天大学)、北京农业大学、北京医学院(北京医科大学)、北京师范大学、天津大学、哈尔滨工业大学、复旦大学、上海交通大学、华东师范大学、上海第一医学院、西安交通大学。

三、 1959年8月28日又增加4所重点大学:
协和医科大学、哈尔滨军事工程学院、第四军医大学、军事通讯工程学院。

四.六十四所重点大学(16+4+44):
1960年10月22日,中央决定在原来20所(16+4)重点大学的基础上,再增加44所重点大学:
1、文理(苏式综合大学): 吉林大学、南开大学、南京大学、武汉大学、中山大学、四川大学、山东大学、山东海洋学院(理科)、兰州大学、
2、工科: 大连工学院、东北工学院、南京工学院、华南工学院、华中工学院、重庆大学、西北工业大学、合肥工业大学、
3、专门性大学:北京石油学院、北京地质学院、北京邮电学院、北京钢铁学院、北京矿业学院、北京铁道学院、北京化工学院、唐山铁道学院、吉林工业大学、大连海运学院、华东水利学院、华东化工学院、华东纺织工学院、同济大学、武汉水电学院、中南矿冶学院、成都电讯工程学院、北京农机化学院、北京林学院、北京中医学院、中山医学院、北京外国语学院、国际关系学院、北京政法学院、北京对外贸易学院、中央音乐学院、北京体育学院

五、 1963年9月12日,教育部通知增加3所重点大学:
浙江大学、厦门大学、上海外国语学院

六、 1963年10月24日,教育部通知增加1所重点大学:
南京农学院
*至此,全国重点高校共68所。

七、1978年全国88所重点大学:
1978年国务院确定了北京大学、清华大学等88所院校为全国性重点大学,因太多,在此不予列举。

八、“七五”、“八五”期间国家重点建设的高校(15所)
北京大学、清华大学、复旦大学、西安交通大学、上海交通大学、中国科技大学、北京医科大学、中国人民大学、北京师范大学、中国农业大学、北京理工大学、哈尔滨工业大学、西北工业大学、北京航空航天大学、国防科学技术大学

九、首批正式设立研究生院的高校22所
1978年,经国务院批准成立中国科技大学研究生院。
1984年8月,经国务院批准22所高校首批试办研究生院:北京大学、中国人民大学、清华大学、北京理工大学、北京航空航天大学、北京科技大学、北京农业大学、北京医科大学、北京师范大学、天津大学、南开大学、哈尔滨工业大学、吉林大学、复旦大学、上海交通大学、浙江大学、南京大学、武汉大学、华中理工大学、国防科学技术大学、西安交通大学、上海医科大学。
十.1986年第二批试办研究生院的高校10所:
1986年4月经国务院批准10所高校试办研究生院: 中山大学、东南大学、东北大学、大连理工大学、厦门大学、华东师范大学、中国地质大学、西北工业大学、同济大学、中国协和医科大学。



因北京医科大学和上海医科大学分别合并到北京大学和复旦大学,目前实际只有31所研究生院(1+22+10-2=31)。

十一、2000年第三批试办研究生院的高校22所:
2000年6月教育部又批准了北方交通大学等22所高校试办研究生院:北方交通大学、北京邮电大学、北京林业大学、东北师范大学、华东理工大学、南京航空航天大学、南京理工大学、中国矿业大学、南京农业大学、山东大学、石油大学、湖南大学、中南大学、华南理工大学、四川大学、重庆大学、西南交通大学、电子科技大学、西安电子科技大学、兰州大学、第二军医大学、第四军医大学。
2002年5月,教育部批准了哈尔滨工程大学、海河大学2所大学试办研究生院。后来又批准西北农林科技大学试办研究生院。
至此全国总共有56所(31+22+2+1=56)研究生院。

十二、2004年教育部指定全国34所考研自行确定复试录取线的高校
北京大学 清华大学 中国人民大学 北京航空航天大学 北京理工大学 天津大学 南开大学 中国农业大学 北京师范大学上海交通大学 大连理工大学 中国科学技术大学 复旦大学 哈尔滨工业大学 吉林大学 同济大学 南京大学 华中科技大学 西安交通大学 东北大学 东南大学 浙江大学 华南理工大学 西北工业大学 厦门大学 湖南大学 武汉大学 兰州大学 电子科技大学 中山大学 中南大学 重庆大学 山东大学 四川大学

十三、首批拥有教授任职资格审批权的高校(32所)
北京大学、清华大学、中国人民大学、北京理工大学、北京航空航天大学、北京师范大学、中国协和医科大学、北京医科大学、北京农业大学、北京科技大学、南开大学、天津大学、哈尔滨工业大学、吉林大学、大连理工大学、东北大学、复旦大学、上海交通大学、同济大学、上海医科大学、华东师范大学、南京大学、东南大学、浙江大学、中国科技大学、厦门大学、武汉大学、华中理工大学、中国地质大学、中山大学、西安交通大学、西北工业大学。

十四、31所副部长级大学(14+7+11-1=31)
(一) 1992年中央指定:14所书记、校长职务由中央管理的高校:北京大学、 清华大学、 中国人民大学、 北京理工大学、 北京航空航天大学 、北京师范大学、中国农业大学 、北京医科大学、中国科技大学、 复旦大学、 上海交通大学、 西安交通大学、 哈尔滨工业大学、 西北工业大学14所高校的党委书记、校长职务由中央直接任命,书记和校长享受副部级待遇。
(二)、2000年增加7所:南京大学 浙江大学 南开大学 天津大学 武汉大学 四川大学 中山大学
(三)、2003年12月再新增11所 :吉林大学、大连理工大学、同济大学、东南大学、厦门大学、中南大学、 华中科技大学、重庆大学、山东大学、兰州大学、西北农林科技大学。
(四)、迄今为止,全国副部级高校总共31所,(*注:北京医科大学已并入北京大学,因此14+7+11-1=31)

十五、1995年第一批入选“211工程”的15所
1995年12月,第一批入选“211工程”的大学共15所:北京大学、清华大学、北京理工大学、北京航空航天大学、中国农业大学、复旦大学、上海交通大学、西安交通大学、哈尔滨工业大学、中国科技大学、南开大学、天津大学、南京大学、浙江大学、西北工业大学。
十六、2003年,教育部公布的入选“211工程”的95所大学名单
继1995年,第一批入选“211工程”的15所大学之后, 1996年中国人民大学等院校及1997年北京科技大学等院校和随后1998年等等一批又一批的大学进入“211工程”,使入选“211”工程大学总共达到95所。2003年教育部公布的这95所大学的名单如下:
北京大学、中国人民大学、清华大学、北京交通大学、北京工业大学、北京航空航天大学、北京理工大学、北京科技大学、北京化工大学、北京邮电大学、中国农业大学、北京林业大学、北京中医药大学、北京师范大学、北京外国语大学、北京广播学院、对外经济贸易大学、中央民族大学、中央音乐学院、南开大学、天津大学、天津医科大学、河北工业大学、太原理工大学、内蒙古大学、辽宁大学、大连理工大学、东北大学、大连海事大学、吉林大学、延边大学、东北师范大学、哈尔滨工业大学、哈尔滨工程大学、东北农业大学、复旦大学、同济大学、上海交通大学、华东理工大学、东华大学、上海第二医科大学、华东师范大学、上海外国语大学、上海财经大学、上海大学、南京大学、苏州大学、东南大学、南京航空航天大学、南京理工大学、中国矿业大学、河海大学、江南大学、南京农业大学、中国药科大学、南京师范大学、浙江大学、安徽大学、中国科学技术大学、厦门大学、福州大学、南昌大学、山东大学、中国海洋大学、石油大学、郑州大学、武汉大学、华中科技大学、中国地质大学、武汉理工大学、湖南大学、中南大学、湖南师范大学、中山大学、暨南大学、华南理工大学、华南师范大学、广西大学、四川大学、重庆大学、西南交通大学、电子科技大学、四川农业大学、西南财经大学、云南大学、西北大学、西安交通大学、西北工业大学、西安电子科技大学、长安大学、兰州大学、新疆大学、第二军医大学、第四军医大学、国防科学技术大学

十七、进入“985工程”大学
第一部分: 已进入“985工程”大学所签署的重点建设协议对各高校的定位及资助经费总量
1998年12月24日,教育部制订的《面向21世纪教育振兴行动计划》将“若干所”正式列入其中,明确指出“创建若干所具有世界先进水平的一流大学和一批一流学科”。
依据国家教育部和各省、市及部委所签订的合同,根据合同书对各学校的定位及资金资助情况(三年内拨款经费总量),按照共建合同签约时间,分列如下:
1. 目标定位:“世界一流大学”
北京大学 18亿 (教育部拨款)
清华大学 18亿 (教育部拨款)
2. 目标定位:“国内一流、国际知名高水平大学”
浙江大学 14亿 (7亿+7亿)(教育部拨款+省拨款) 1999年11月8日
南京大学 12亿 (6亿+6亿)(教育部拨款+省拨款) 1999年7月26日
复旦大学 12亿 (6亿+6亿)(教育部拨款+市拨款) 1999年7月27日
上海交通大学 12亿 (6亿+6亿)(教育部拨款+市拨款) 1999年7月27日
中国科技大学 9亿 (3亿+3亿+3亿)(教育部拨款+中科院拨款+省拨款)1999年7月25 日
西安交通大学 9亿 (6亿+3亿)(教育部拨款+省拨款) 1999年9月11日
哈尔滨工业大学 10亿 (3亿+3亿+4亿)(教育部拨款+国防科工委拨款+省拨款)1999年11月14日
北京理工大学 10亿 (3亿+3亿+4亿)(教育部拨款+国防科工委拨款+市拨款)2000月 9月23日
北京师范大学 12亿 (6亿+6亿) (教育部拨款+市拨款)2002月8月24日

*以上的大学即所谓的“2”+“9”工程,是国家投资建设大学的重中之重。
中国人民大学“国际知名的世界一流大学”(虽已签约、但经费未公布)

3. 目标定位:“国内外知名的高水平大学”
依据中央资助经费经费情况分列如下:
1) 中央资助经费为3亿以上(不含3亿)的大学:
北京航空航天大学 9亿 (3亿+3亿+3亿)(教育部拨款+国防科工委拨款+市拨款)2001
年9月23日
西北工业大学 9亿 (3亿+3亿+3亿)(教育部拨款+国防科工委拨款+陕西省、西安市
以土地等形式) 2002年1月22日
南开大学、天津大学 两校共14亿 (教育部拨款+市拨款) 2000年12月25日
武汉大学 8亿 (4亿+4亿)(教育部拨款+省拨款) 2001年2月13日
四川大学 7.2亿 (4亿+3.2亿) (教育部拨款+省拨款) 2001年9月29日
吉林大学 7亿 (4亿+3亿) (教育部拨款+省拨款) 2001年2月22日

2) 中央资助经费为3亿的大学:
中山大学 12亿 (3亿+9亿) (教育部拨款+省拨款) 2001年10月26日
山东大学 8亿 (3亿+5亿) (教育部拨款+省拨款) 2001年2月26日
东南大学 6亿 (3亿+3亿) (教育部拨款+省拨款) 2001年2月12日
华中科技大学 6亿 (3亿+3亿) (教育部拨款+湖北省、武汉市以资金、项目等形式) 2001年2月13日
厦门大学 6亿 (3亿 +1.5亿+1.5亿)(教育部拨款+福建省拨款+厦门市拨款)2001年2月22日
同济大学 6亿 (3亿+3亿) (教育部拨款+市拨款) 2002年6月26日
重庆大学 5.4亿 (3亿+2.4亿) (教育部拨款+市拨款) 2001年9月28日
兰州大学 4.5亿 (3亿+1.5亿+土地)(教育部拨款+省拨款) 2001年12月9日

3) 中央资助经费为2亿的大学:
中南大学 4亿 (2亿+2亿) (教育部拨款+省拨款) 2001年2月27日
湖南大学 4亿 (2亿+2亿) (教育部拨款+省拨款) 2001年2月27日
大连理工大学 4亿 (2亿+2亿) (教育部拨款+辽宁省、大连市拨款) 2001年8月8日
华南理工大学 4亿 (2亿+2亿) (教育部拨款+省拨款) 2001年10月26日
东北大学 4亿 (2亿+1亿+1亿)(教育部拨款+省拨款+沈阳市拨款) 2002年1月23日
成都电子科技大学 3.6亿 (2亿+1.6亿) (教育部拨款+省拨款) 2001年9月29日
中国海洋大学 3亿 (教育部、山东省、中国海洋局、青岛市总拨款额)2001年2月27日
*2004年,又有中国农业大学,国防科技大学,中央民族大学,西北农林科技大学进入“985工程”的行列,使“985工程”大学总数达到38所(34+4)。

十八、国家重点投资建设的十所重中之重大学
自1952年至2000年,中共中央、中央政府、教育部一共公布了七次"重点大学"或"重点建设首批"名单,取其交集,集中于下述十所(即"2+8"十所) 名校,他们无愧堪称为"重点中的重点"。
"2"-世界一流;"8"-世界知名,按如下顺序:
北方:清华、北大、北理工、哈工大、西交
南方:南大、复旦、上交、浙大、中科大

*十九、教育部直属大学
从1952年起,教育部指定了一批又一批的大学为教育部直属的(重点)大学,如北大、清华、人大、复旦等。70年代末,只有不到30所,然而从90年代中后期起,急剧扩编,至今已有72所大学纳入教育部直属大学。这些大学只是教育部直属的,他们中有的纳入全国重点大学(如全国六所、十六所、六十四所、八十八所重点大学,211工程95所重点大学,985工程38所重点大学),有的则不属于全国重点大学。到目前为止,仍有十几所教育部直属大学未纳入国家211工程(即不属于国家重点大学)。因此教育部直属大学与全国性重点大学是两个不同的概念,不可混为一谈。
当然全国的著名的重点大学主要集中教育部直属大学这个集团,除外还有直属中科院和国防科工委的中国科技大学、哈尔滨工业大学、北京理工大学、北京航空航天大学、西北工业大学。

72所教育部直属大学名单:
清华大学 北京大学 中国人民大学 北京科技大学
北京化工大学 北京师范大学 北京外国语大学 北京语言文化大学
南开大学 天津大学 东北大学 大连理工大学
吉林大学 中南财经政法大学 东北师范大学 复旦大学
上海交通大学 同济大学 华东理工大学 西安电子科技大学
华东师范大学 上海外国语大学 南京大学 东南大学
无锡轻工大学 合肥工业大学 浙江大学 厦门大学
山东大学 青岛海洋大学 武汉大学 西南交通大学
中国地质大学 华中师范大学 湖南大学 中国药科大学
中山大学 华南理工大学 兰州大学 电子科技大学
四川大学 重庆大学 西南师范大学 西安交通大学
陕西师范大学 西南财经大学 西北农林科技大学 对外经济贸易大学
石油大学 北京邮电大学 中国农业大学 北京林业大学
北京广播学院 河海大学 中国政法大学 中央音乐学院
中国矿业大学 上海财经大学 东北林业大学 华中农业大学
南京农业大学 东华大学 中央戏剧学院 长安大学
北方交通大学 华中科技大学 中南大学 中央财经大学
武汉理工大学 中央美术学院 北京中医药大学 华北电力大学

*二十、国防科委院校
国防科工委院校是规模仅次于教育部直属院校的另一个大学集团。1952年,中共中央指定北京工业学院(北京理工大学)、哈尔滨工业大学、北京航空学院(北京航空航天大学)、上海交通大学四所大学为国防院校。
国防院校后来又改名为国防科委院校。从50年代后期,先后又有西北工大、成都电讯、南航加入到国防院校的行列,至1963年我国共有八所国防科委院校:哈尔滨工业大学(船舶 & 综和)、北京理工大学(导弹 & 坦克)、北京航空航天大学(飞机 & 导弹)、上海交通大学(船舶&火车)、西北工业大学(飞机&导弹 & 船舶)、成都电讯工程学院(电子)、南京航空航天大学(飞机)、太原机械学院(兵器--现在的中北大学)
1966年,国防科委院校在上述八大院校的基础上又增加了哈军工、西军电、南炮工。
七十年代初国防科委院校解散,哈工大、上海交大及哈船工(原哈军工的海军系)分到船舶部。北航、西工大、南航分到航空部。北理工、南京理工大学(即南炮工)分到兵器部。电子科大(成都电讯)、西安电子科大(西军电)被分到电子部。随后,哈工大转到航天部;上海交大转到教育部;电子科大、西安电子科大分到电子部后来又归到信息产业部。哈军工的主体改名为国防科技大学,1989年归总参领导。
1996年,恢复国防科工委院校。只有七所:哈工大、北航、北理工、西工大、南理工、南航、哈船工。该七所国防科工委院校全是211工程大学;其中哈工大、北理工、北航、西工大是首批15所进入211工程的大学,而且也是排在靠前位置的985工程大学。

*二十一、国防院校十分重要的地位
1、50-60年代四所国防院校全部纳入国家重点扶植的10所大学(清华、北大、复旦、西交大、中科大、哈军工、哈工大、北理工、北航、上海交大)。
2、1959年中共中央指定16所重点大学,国防院校就占了4所(哈工大、北理工、北航、上海交大)。
3、70年代末,国务院批准了第一批向联合国教科文组织贷款的10所大学中,国防院校也占有4所:清华、北大、复旦、上交大、西交大、中科大、国防科大、哈工大、北理工、北航。
4、1983年,中国在联合国备案的14所重点大学国防院校占了4所:国防科技大学、哈工大、北理工、北航。
5、“七五”、“八五”期间国家重点建设的高校15所,国防院校也占了5(4+1)所:国防科技大学、哈工大、北理工、北航、西工大(后补上的)。
6、1995年,第一批入选“211工程”的大学共15所:国防院校也占了4所(哈工大、北航、北理工、西工大)
7、1992年中央指定的14所书记、校长职务由中央管理的高校中(即副部长级),国防院校也占4所(哈工大、北航、北理工、西工大)。
8、1999年开始的985工程,获取中央资助在6亿(含6亿)以上,且总资助在9亿(含9亿)以上的大学13所,国防院校也占了4所(哈工大、北理工、北航、西工大)。

posted @ 2007-04-24 17:55 啤酒 阅读(6030) | 评论 (1)编辑 收藏

2006年9月7日

带有界面的“读取日志”! 不知道哪位会作分析,算法不会呀!只读没意思呀

// Read_EventDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Read_Event.h"
#include "Read_EventDlg.h"
#include "DescriptionDiaLog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////
//int event_auditsucceed_num;  //记录审核成功记录的个数
//int event_info_num;    //记录信息记录的个数
//int event_error_num;    //记录错误记录的个数 
//int event_warn_num;    //记录警告记录的个数
//int event_auditdefeat_num;  //记录审核失败的个数

//char *event_category;     //事件类
//char *event_sourcename=NULL;   //事件来源
//char *event_computername=NULL;  //事件计算机名
//char *event_descriptive_msg=NULL;  //事件描述
//char event_el_user[257];    //事件用户
//char event_el_domain[257];   //事件域
//char host_final_out_msg[1024];  //最后输出的信息

FILE *fp;        //保存的文件
int hh=0;        //记录类型的标志,用于位图的选择
int event_record=0;      //事件记录的个数
os_el el[1];
int nItem=0;       //对于索引记录的当前标志
int istype=0;       //用于事件类型的标志
BOOL issub;        //一个开关项
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
 CAboutDlg();

// Dialog Data
 //{{AFX_DATA(CAboutDlg)
 enum { IDD = IDD_ABOUTBOX };
 //}}AFX_DATA

 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CAboutDlg)
 protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
 //}}AFX_VIRTUAL

// Implementation
protected:
 //{{AFX_MSG(CAboutDlg)
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
 //{{AFX_DATA_INIT(CAboutDlg)
 //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CAboutDlg)
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
 //{{AFX_MSG_MAP(CAboutDlg)
  // No message handlers
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRead_EventDlg dialog

CRead_EventDlg::CRead_EventDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CRead_EventDlg::IDD, pParent)
{
 //{{AFX_DATA_INIT(CRead_EventDlg)
 m_mm_host_state = _T("");
 //}}AFX_DATA_INIT
 // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CRead_EventDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CRead_EventDlg)
 DDX_Control(pDX, IDC_LIST, m_mm_host_ListCtrl);
 DDX_Text(pDX, IDC_STATE, m_mm_host_state);
 //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CRead_EventDlg, CDialog)
 //{{AFX_MSG_MAP(CRead_EventDlg)
 ON_WM_SYSCOMMAND()
 ON_WM_PAINT()
 ON_WM_QUERYDRAGICON()
 ON_BN_CLICKED(IDC_SECURE, OnSecure)
 ON_BN_CLICKED(IDC_SYSTEM, OnSystem)
 ON_BN_CLICKED(IDC_APPLICATION, OnApplication)
 ON_NOTIFY(NM_CLICK, IDC_LIST, OnClickList)
 ON_BN_CLICKED(IDC_DELETE, OnDelete)
 ON_BN_CLICKED(IDC_DETAIL, OnDetail)
 ON_BN_CLICKED(IDC_SAVE, OnSave)
 ON_BN_CLICKED(IDC_SAVEHARD, OnSave_Hard)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRead_EventDlg message handlers

BOOL CRead_EventDlg::OnInitDialog()
{
 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.
 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);
 if (pSysMenu != NULL)
 {
  CString strAboutMenu;
  strAboutMenu.LoadString(IDS_ABOUTBOX);
  if (!strAboutMenu.IsEmpty())
  {
   pSysMenu->AppendMenu(MF_SEPARATOR);
   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  }
 }

 // Set the icon for this dialog.  The framework does this automatically
 //  when the application's main window is not a dialog
 SetIcon(m_hIcon, TRUE);   // Set big icon
 SetIcon(m_hIcon, FALSE);  // Set small icon
 
 // TODO: Add extra initialization here
 

//////////////////////////我加的///////////////////////

 issub=false;
 //给各项事件数目初始化
 Set_EventNum();       

 m_mm_host_ListCtrl.SetRedraw(FALSE);
    //更新内容
    m_mm_host_ListCtrl.SetRedraw(TRUE);
    m_mm_host_ListCtrl.Invalidate();
    m_mm_host_ListCtrl.UpdateWindow();
 //删除所有的列
 m_mm_host_ListCtrl.DeleteAllItems();


 //给图表初始化
 Init_ImageList();
 //设置m_mm_host_ListCtrl风格
 LONG lStyle;
    lStyle = GetWindowLong(m_mm_host_ListCtrl.m_hWnd, GWL_STYLE);//获取当前窗口style
    lStyle &= ~LVS_TYPEMASK; //清除显示方式位
    lStyle |= LVS_REPORT; //设置style
    SetWindowLong(m_mm_host_ListCtrl.m_hWnd, GWL_STYLE, lStyle);//设置style
 
    DWORD dwStyle = m_mm_host_ListCtrl.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
    dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
    dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
 dwStyle |=LVS_EX_HEADERDRAGDROP;
 dwStyle |=LVS_EX_SUBITEMIMAGES;
    m_mm_host_ListCtrl.SetExtendedStyle(dwStyle); //设置扩展风格


 //插入列
 m_mm_host_ListCtrl.InsertColumn(0,"日志序号",LVCFMT_CENTER,60,0);
 m_mm_host_ListCtrl.InsertColumn(1,"分类",LVCFMT_CENTER,80,4);
 m_mm_host_ListCtrl.InsertColumn(2,"来源",LVCFMT_CENTER,80,1);
 m_mm_host_ListCtrl.InsertColumn(3,"日期",LVCFMT_CENTER,80,2);
 m_mm_host_ListCtrl.InsertColumn(4,"时间",LVCFMT_CENTER,80,3);
 m_mm_host_ListCtrl.InsertColumn(5,"ID",LVCFMT_CENTER,50,5);
 m_mm_host_ListCtrl.InsertColumn(6,"用户",LVCFMT_CENTER,120,6);
 m_mm_host_ListCtrl.InsertColumn(7,"计算机",LVCFMT_CENTER,120,7);
 m_mm_host_ListCtrl.InsertColumn(8,"描述",LVCFMT_CENTER,250,7);
//////////////////////////我加的///////////////////////


 return TRUE;  // return TRUE  unless you set the focus to a control
}

void CRead_EventDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
 if ((nID & 0xFFF0) == IDM_ABOUTBOX)
 {
  CAboutDlg dlgAbout;
  dlgAbout.DoModal();
 }
 else
 {
  CDialog::OnSysCommand(nID, lParam);
 }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CRead_EventDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CDialog::OnPaint();
 }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.

HCURSOR CRead_EventDlg::OnQueryDragIcon()
{
 return (HCURSOR) m_hIcon;
}
///////////////////////////////////////////////////////////
void CRead_EventDlg::OnSecure()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);
 Set_EventNum();
 m_mm_host_state=_T("安全日志列表");
 Win_startel("Security");
 istype=1;
 UpdateData(FALSE);
}
////////////////////////////////////////////////////////////
void CRead_EventDlg::OnSystem()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);
 Set_EventNum();
 m_mm_host_state=_T("系统日志列表");
 Win_startel("System");
 istype=2;
 UpdateData(FALSE);
}
///////////////////////////////////////////////////////////
void CRead_EventDlg::OnApplication()
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE);
 Set_EventNum();
 m_mm_host_state=_T("应用日志列表");
 Win_startel("Application");
 istype=3;
 UpdateData(FALSE);
}
////////////////////////////////////////////////////////////
char* CRead_EventDlg::El_GetCategory(int category_id)
{
 //得到事件记录的类型并且返回
 char *cat;
 if(!issub)
 {
  switch(category_id)
  {
   case EVENTLOG_AUDIT_SUCCESS:
    cat = "审核成功";
    event_auditsucceed_num++;
    hh=1;
    break;
   case EVENTLOG_INFORMATION_TYPE:
    cat = "信息";
    event_info_num++;
    hh=2;
    break;
   case EVENTLOG_ERROR_TYPE:
    cat = "错误";
    event_error_num++;
    hh=3;
    break;
   case EVENTLOG_WARNING_TYPE:
    cat = "警告";
    event_warn_num++;
    hh=4;
    break;
   case EVENTLOG_AUDIT_FAILURE:
    cat = "审核失败";
    event_auditdefeat_num++;
    hh=5;
    break;
   default:
    cat = "Unknown";
    break;
  }
 }
 else
 {
  switch(category_id)
  {
   case EVENTLOG_AUDIT_SUCCESS:
    cat = "审核成功";
    hh=1;
    break;
   case EVENTLOG_INFORMATION_TYPE:
    cat = "信息";
    hh=2;
    break;
   case EVENTLOG_ERROR_TYPE:
    cat = "错误";
    hh=3;
    break;
   case EVENTLOG_WARNING_TYPE:
    cat = "警告";
    hh=4;
    break;
   case EVENTLOG_AUDIT_FAILURE:
    cat = "审核失败";
    hh=5;
    break;
   default:
    cat = "Unknown";
    break;
  }
 }
   
    return(cat);
}
////////////////////////////////////////////////////////////////
int CRead_EventDlg::El_getEventDLL(char *evt_name, char *event_sourcename1, char *event)
{
 HKEY key;
    DWORD ret;
    char keyname[256];


    keyname[255] = '\0';

    _snprintf(keyname, 254,
            "System\\CurrentControlSet\\Services\\EventLog\\%s\\%s",
            evt_name,
            event_sourcename1);

    // 打开注册表Opening registry     
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyname, 0, KEY_ALL_ACCESS, &key)
            != ERROR_SUCCESS)
    {
        return(0);   
    }


    ret = MAX_PATH -1; 
    if (RegQueryValueEx(key, "EventMessageFile", NULL,
                NULL, (LPBYTE)event, &ret) != ERROR_SUCCESS)
    {
        event[0] = '\0'; 
        return(0);
    }

    RegCloseKey(key);
    return(1);
}
////////////////////////////////////////////////////////////////
char* CRead_EventDlg::El_GetMessage(EVENTLOGRECORD *er, char *event_name, char *event_sourcename2, LPTSTR *el_sstring)
{
 DWORD fm_flags = 0;
    char tmp_str[257];
    char event[MAX_PATH +1];
    char *curr_str;
    char *next_str;
    LPSTR message = NULL;

    HMODULE hevt;

    // Initializing variables
    event[MAX_PATH] = '\0';
    tmp_str[256] = '\0';

    //Flags for format event
    fm_flags |= FORMAT_MESSAGE_FROM_HMODULE;
    fm_flags |= FORMAT_MESSAGE_ALLOCATE_BUFFER;
    fm_flags |= FORMAT_MESSAGE_ARGUMENT_ARRAY;

    //Get the file name from the registry (stored on event)
    if(!El_getEventDLL(event_name, event_sourcename2, event))
    {
        return(NULL);    
    }    

    curr_str = event;

    // If our event has multiple libraries, try each one of them 
    while((next_str = strchr(curr_str, ';')))
    {
        *next_str = '\0';
        next_str++;

        ExpandEnvironmentStrings(curr_str, tmp_str, 255);
        hevt = LoadLibraryEx(tmp_str, NULL, DONT_RESOLVE_DLL_REFERENCES);
        if(hevt)
        {
            if(!FormatMessage(fm_flags, hevt, er->EventID,
                        0,
                        (LPTSTR) &message, 0, el_sstring))
            {
                message = NULL;   
            }
            FreeLibrary(hevt);

            /* If we have a message, we can return it */
            if(message)
                return(message);
        }

        curr_str = next_str;  
    }

    ExpandEnvironmentStrings(curr_str, tmp_str, 255);
    hevt = LoadLibraryEx(tmp_str, NULL, DONT_RESOLVE_DLL_REFERENCES);
    if(hevt)
    {
        int hr;   
        if(!(hr = FormatMessage(fm_flags, hevt, er->EventID,
                        0,
                        (LPTSTR) &message, 0, el_sstring)))
        {
            message = NULL;   
        }
        FreeLibrary(hevt);

        /* If we have a message, we can return it */
        if(message)
            return(message);
    }

    return(NULL);
}
/////////////////////////////////////////////////////////////////
BOOL CRead_EventDlg::Init_ImageList()
{
 //给图表初始化设置
  HIMAGELIST hList = ImageList_Create(32,32, ILC_COLOR8 |ILC_MASK , 6, 1);
  m_cImageListNormal.Attach(hList);
 
  hList = ImageList_Create(16, 16, ILC_COLOR8 | ILC_MASK, 6, 1);
  m_cImageListSmall.Attach(hList);

  // Load the large icons
  CBitmap cBmp;
 
  cBmp.LoadBitmap(IDB_BITMAP1);
  m_cImageListNormal.Add(&cBmp, RGB(255,0, 255));
  cBmp.DeleteObject();
 
  // Load the small icons
  cBmp.LoadBitmap(IDB_BITMAP2);
  m_cImageListSmall.Add(&cBmp, RGB(255,0, 255));
 
  // Attach them
  m_mm_host_ListCtrl.SetImageList(&m_cImageListNormal, LVSIL_NORMAL);
  m_mm_host_ListCtrl.SetImageList(&m_cImageListSmall, LVSIL_SMALL);
 
  return TRUE;
}
///////////////////////////////////////////////////////////////
void CRead_EventDlg::Insert_Record()
{
 //在列表中插入列表项
 CString str; 
 LVITEM lvi;

 lvi.mask =  LVIF_TEXT;
 lvi.iItem = event_record;
 str.Format(_T("%d"),event_record+1);
 lvi.iSubItem = 0;
 lvi.pszText = (LPTSTR)(LPCTSTR)(str);
 m_mm_host_ListCtrl.InsertItem(&lvi);


 str.Format(_T("%s"), event_category);
 lvi.iSubItem = 1;
 lvi.mask =  LVIF_IMAGE | LVIF_TEXT;
 lvi.pszText = (LPTSTR)(LPCTSTR)(str);
 //选择位图  
 switch(hh)
 {
 case 0:
  lvi.iImage = 0; 
  break;
 case 1:
  lvi.iImage = 1;
  break;
 case 2:
  lvi.iImage = 2;
  break;
 case 3:
  lvi.iImage = 3;
  break;
 case 4:
  lvi.iImage = 4;
  break;
 default:
  lvi.iImage = 5;
  break;
 }
 
 m_mm_host_ListCtrl.SetItem(&lvi);

 //输出来源  
 str.Format(_T("%s"),event_sourcename);
 lvi.iSubItem = 2;
 lvi.mask = LVIF_TEXT;
 lvi.pszText = (LPTSTR)(LPCTSTR)(str);
 m_mm_host_ListCtrl.SetItem(&lvi);
 //输出日期  
 tm  *event_time = localtime((const  long  *)&el->er->TimeWritten);
 str.Format(_T("%4hd-%2hd-%2hd"),event_time->tm_year + 1900,event_time->tm_mon + 1,event_time->tm_mday);
 lvi.iSubItem = 3;
 lvi.pszText = (LPTSTR)(LPCTSTR)(str);
 m_mm_host_ListCtrl.SetItem(&lvi);
 //输出时间  
 str.Format(_T("%.2hd:%.2hd:%.2hd"),event_time->tm_hour,event_time->tm_min,event_time->tm_sec);
 lvi.iSubItem = 4;
 lvi.pszText = (LPTSTR)(LPCTSTR)(str);
 m_mm_host_ListCtrl.SetItem(&lvi);

 //输出ID
 str.Format(_T("%d"),(WORD)el->er->EventID);
 lvi.iSubItem = 5;
 lvi.pszText = (LPTSTR)(LPCTSTR)(str);
 m_mm_host_ListCtrl.SetItem(&lvi);
 //输出用户  
 str.Format(_T("%s/%s"),event_el_domain,event_el_user);
 lvi.iSubItem = 6;
 lvi.pszText = (LPTSTR)(LPCTSTR)(str);
 m_mm_host_ListCtrl.SetItem(&lvi);
 //输出计算机  
 str.Format(_T("%s"),event_computername);
 lvi.iSubItem = 7;
 lvi.pszText = (LPTSTR)(LPCTSTR)(str);
 m_mm_host_ListCtrl.SetItem(&lvi);
 //输出描述
 str.Format(_T("%s"),event_descriptive_msg);
 lvi.iSubItem = 8;
 lvi.pszText = (LPTSTR)(LPCTSTR)(str);
 m_mm_host_ListCtrl.SetItem(&lvi);
}
///////////////////////////////////////////////////////////////////////
void CRead_EventDlg::OnClickList(NMHDR* pNMHDR, LRESULT* pResult)
{
 //当鼠标在类别中点击时,返回被点中的记录号
 // TODO: Add your control notification handler code here
 nItem = -1;
 LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;

 if(lpNMItemActivate != NULL)
 {
  nItem = lpNMItemActivate->iItem+1;
 }
 
 *pResult = 0;
}
//////////////////////////////////////////////////////////////
void CRead_EventDlg::OnDelete()
{
 //删除被选中的记录
 // TODO: Add your control notification handler code here
 //判断是否选择了日志类型,如果没有退出
 if ((istype!=1)&&(istype!=2)&&(istype!=3))
 {
  MessageBox("请选择日志类型!","警告!",MB_OK|MB_ICONEXCLAMATION);
  return ;
 }
 //判断是否选中了记录,如果没有退出
 if (nItem==0)
 {
  MessageBox("请选择日志记录!","警告!",MB_OK|MB_ICONEXCLAMATION);
  return ;
 }

 int i,iState;
 int nItemSelected=m_mm_host_ListCtrl.GetSelectedCount();//得到所选表项数
 int nItemCount=m_mm_host_ListCtrl.GetItemCount();//得到表项总数
 
 //如果没有选中,退出
 if(nItemSelected<1)
 {
  MessageBox("请选择日志记录!","警告!",MB_OK|MB_ICONEXCLAMATION); 
  return;  
 }

 //对选中的记录进行删除
 for(i=nItemCount-1;i>=0;i--)
 {

  iState=m_mm_host_ListCtrl.GetItemState(i,LVIS_SELECTED);

  if(iState!=0)
  {
   m_mm_host_ListCtrl.DeleteItem(i);
   nItem=0;
  }  
 }
 
 if (((istype!=1)&&(istype!=2)&&(istype!=3)))
 {
  MessageBox("请选择日志类型!","警告!",MB_OK|MB_ICONEXCLAMATION);
  return ;
 }


}
//////////////////////////////////////////////////////////////////////
void CRead_EventDlg::OnDetail()
{
 //按钮响应函数
 //判断是否选中类型,没有就退出
 if ((istype!=1)&&(istype!=2)&&(istype!=3))
 {
  MessageBox("请选择日志类型!","警告!",MB_OK|MB_ICONEXCLAMATION);
  return ;
 }
 //判断选中记录,没有就退出
 if (nItem==0)
 {
  MessageBox("请选择日志记录!","警告!",MB_OK|MB_ICONEXCLAMATION);
  return ;
 }
 //如果选中类型就调用DescriptionDiaLog对话框
 if ((istype==1)||(istype==2)||(istype==3))
 {
  DescriptionDiaLog DescriptionDlg;
  DescriptionDlg.DoModal();
 }
 
 else
 {
  MessageBox("请选择日志类型!","警告!",MB_OK|MB_ICONINFORMATION);

  return ;
 }

 // TODO: Add your control notification handler code here

}
/////////////////////////////////////////////////////////////////////
void CRead_EventDlg::OnSave()
{
 // TODO: Add your control notification handler code here
 //对日志进行列表保存
 //判断列表是否有记录
 switch(istype)
 {
 case 1:
  break;
 case 2:
  break;
 case 3:
  break;
 default:
  MessageBox("请选择日志类型","警告!",MB_OK|MB_ICONEXCLAMATION);
  return;
   }
 //得到列表中记录的总数
 event_record=m_mm_host_ListCtrl.GetItemCount();
 //对日志进行保存
 //保存单个记录
 CString sFileName;
 sFileName.Format("");

 CFileDialog dlg(FALSE, "txt", sFileName,
     OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,
     "文本文件(*.txt)|*.txt|文本文件(*.doc)|*.doc||", this); 
 if (nItem!=0)
 {
  if(IDCANCEL == (MessageBox("您确定要保存一个日志记录?","提示!",MB_OKCANCEL|MB_ICONQUESTION)))
  {
   nItem=0;
   return;
  }
  if (dlg.DoModal() == IDOK)
  {
   dlg.m_ofn.lpstrTitle = _T("保存日志记录");
   CString fileName = dlg.GetPathName();
   fp = fopen(fileName,"w");
   Save_Single_Record(nItem);

  }
  nItem=0;
  return ;
 }

 ///////////////////////////////////
 //保存整个列表记录
 if(IDCANCEL==(MessageBox("您确定要保存日志文件?","提示!",MB_OKCANCEL|MB_ICONQUESTION)))
 {
  nItem=0;
  return;
 }


 if (dlg.DoModal() == IDOK)
 {
  dlg.m_ofn.lpstrTitle = _T("保存日志文件");
  CString fileName = dlg.GetPathName();

  fp = fopen(fileName,"w");
  switch(istype)
  {
  case 1:
   Save_Security();
   break;
  case 2:
   Save_System();
   break;
  case 3:
   Save_Application();
   break;
  default:
   MessageBox("请选择日志类型","警告!",MB_OK|MB_ICONEXCLAMATION);
   return;
    }

 }
}
//////////////////////////////////////////////////////////////////////
void CRead_EventDlg::Read_event(os_el *el, int printit)
{
 //读取日志
 DWORD nstr;
    DWORD user_size;
    DWORD domain_size;
    DWORD read, needed;
    int size_left;
    int str_size;

    char *mbuffer[BUFFER_SIZE];
    LPSTR sstr = NULL;
 //int i=0;
 char *tmp_str = NULL;


 char el_string[1025];
    LPSTR el_sstring[57];

    //Er must point to the mbuffer
    el->er = (EVENTLOGRECORD *) &mbuffer;

    /* Zeroing the last values */
    el_string[1024] = '\0';
    event_el_user[256] = '\0';
    event_el_domain[256] = '\0';
    host_final_out_msg[1023] = '\0';
    el_sstring[56] = NULL;
 //判断是否有记录
 if( my_host_IsListCtrl == true)
 {
  my_host_IsListCtrl = false;
  m_mm_host_ListCtrl.DeleteAllItems();
 }

    //读日志记录   
    while(ReadEventLog(el->h,
                EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,
                0,
                el->er, BUFFER_SIZE -1, &read, &needed))
    {

        while(read > 0)
        {


   //得到事件的类型
            event_category = El_GetCategory(el->er->EventType);
   //得到事件来源
            event_sourcename = (LPSTR) ((LPBYTE) el->er + sizeof(EVENTLOGRECORD));
   //得到计算机名
            event_computername = event_sourcename + strlen(event_sourcename) + 1;
   //给描述信息初始化
            event_descriptive_msg = NULL;


            // 初始化domain/user尺寸
            user_size = 255; domain_size = 255;
            event_el_domain[0] = '\0';
            event_el_user[0] = '\0';

   
            // 设置事件的一些描述
            if(el->er->NumStrings)
            { 
                size_left = 1020; 

                sstr = (LPSTR)((LPBYTE)el->er + el->er->StringOffset);
                el_string[0] = '\0';

                for (nstr = 0;nstr < el->er->NumStrings;nstr++)
                {
                    str_size = strlen(sstr); 
                    strncat(el_string, sstr, size_left);

                    tmp_str= strchr(el_string, '\0');
                    if(tmp_str)
                    {
                        *tmp_str = ' ';  
                        tmp_str++; *tmp_str = '\0';
                    }
                    size_left-=str_size + 1;

                    if(nstr <= 54)
                        el_sstring[nstr] = (LPSTR)sstr;

                    sstr = strchr( (LPSTR)sstr, '\0');
                    sstr++;
     
                }

                // 得到事件描述
                event_descriptive_msg = El_GetMessage(el->er, el->event_name, event_sourcename, el_sstring);
                if(event_descriptive_msg != NULL)
                {
                 
                    tmp_str = event_descriptive_msg;   
                    while((tmp_str = strchr(tmp_str, '\n')))
                    {
                        *tmp_str = ' ';
                        tmp_str++;         
                    }   

                    tmp_str = event_descriptive_msg;   
                    while((tmp_str = strchr(tmp_str, '\r')))
                    {
                        *tmp_str = ' ';
                        tmp_str++;
      //strchr(tmp_str, '\n');
                    }   
                }
            }
            else
            {
                strncpy(el_string, "(no message)", 1020); 
            }
            // 得到username
            if (el->er->UserSidLength)
            {
                SID_NAME_USE account_type;
                if(!LookupAccountSid(NULL, (SID *)((LPSTR)el->er + el->er->UserSidOffset),
                            event_el_user, &user_size, event_el_domain, &domain_size, &account_type))  
                {
                    strncpy(event_el_user, "(no user)", 255);
                    strncpy(event_el_domain, "no domain", 255);
                }

            }

            else
            {
                strncpy(event_el_user, "A", 255); 
                strncpy(event_el_domain, "N", 255); 
            }
   
   /////////////////////////////////////
   //插入列表
   Insert_Record();
   ////////////////////////////////////
   
            if(event_descriptive_msg != NULL)
                LocalFree(event_descriptive_msg);

            // Changing the point to the er
   //i++;
   event_record++;
            read -= el->er->Length;
            el->er = (EVENTLOGRECORD *)((LPBYTE) el->er + el->er->Length);
   
        } 
  my_host_IsListCtrl = true;
  
  CString strlove;
  //输出事件个数
  strlove.Format("%d",event_record);
  GetDlgItem(IDC_EVENTNUM)->SetWindowText(strlove);
  //输出事件错误个数
  strlove.Format("%d",event_error_num);
  GetDlgItem(IDC_ERRORNUM)->SetWindowText(strlove);
  //输出事件信息个数
  strlove.Format("%d",event_info_num);
  GetDlgItem(IDC_INFONUM)->SetWindowText(strlove);
  //输出事件警告个数
  strlove.Format("%d",event_warn_num);
  GetDlgItem(IDC_WARNNUM)->SetWindowText(strlove);
  //输出事件审核成功个数  
  strlove.Format("%d",event_auditsucceed_num);
  GetDlgItem(IDC_AUDITSUCCEEDNUM)->SetWindowText(strlove);
  //输出事件审核失败个数  
  strlove.Format("%d",event_auditdefeat_num);
  GetDlgItem(IDC_AUDITDEFEATNUM)->SetWindowText(strlove);

        // Setting er to the beginning of the buffer 
        el->er = (EVENTLOGRECORD *)&mbuffer;  
    }
 event_record=0;
}
///////////////////////////////////////////////////////////////////////////
void CRead_EventDlg::Set_EventNum()

 //给记录数字初始化
 event_record=0;
 event_auditsucceed_num=0;
 event_info_num=0;
 event_error_num=0;
 event_warn_num=0;
 event_auditdefeat_num=0;

}
///////////////////////////////////////////////////////////////////
int CRead_EventDlg::Start_EL(char *app, os_el *el)
{

 el->h = OpenEventLog(NULL, app);
    if(!el->h)
    {
        return(0);    
    }

    el->event_name = app;
    GetOldestEventLogRecord(el->h, &el->record);

    return(1);
}
////////////////////////////////////////////////////////////////////////
void CRead_EventDlg::Win_startel(char *eventlog)
{
 Start_EL(eventlog,el);
    Read_event(el,1);
}
////////////////////////////////////////////////////////////////////
void CRead_EventDlg::Save_event(os_el *el, int printit)
{
 event_record=0;
 DWORD nstr;
    DWORD user_size;
    DWORD domain_size;
    DWORD read, needed;
    int size_left;
    int str_size;

    char *mbuffer[BUFFER_SIZE];
    LPSTR sstr = NULL;
 //int i=0;
 char *tmp_str = NULL;
 
    char el_string[1025];
    char final_out_msg[1024];  //最后输出的信息
    LPSTR el_sstring[57];

    /* Er must point to the mbuffer */
    el->er = (EVENTLOGRECORD *) &mbuffer;

    // Zeroing the last values
    el_string[1024] = '\0';
    event_el_user[256] = '\0';
    event_el_domain[256] = '\0';
    final_out_msg[1023] = '\0';
    el_sstring[56] = NULL;

    // Reading the event log     
    while(ReadEventLog(el->h,
                EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,
                0,
                el->er, BUFFER_SIZE -1, &read, &needed))
    {
        while(read > 0)
        {
   //得到事件的类型
            event_category = El_GetCategory(el->er->EventType);
   //得到事件来源
            event_sourcename = (LPSTR) ((LPBYTE) el->er + sizeof(EVENTLOGRECORD));
   //得到计算机名
            event_computername = event_sourcename + strlen(event_sourcename) + 1;
   //给描述信息初始化
            event_descriptive_msg = NULL;


            //初始化domain/user尺寸
            user_size = 255; domain_size = 255;
            event_el_domain[0] = '\0';
            event_el_user[0] = '\0';


            // 设置事件的一些描述
            if(el->er->NumStrings)
            { 
                size_left = 1020; 

                sstr = (LPSTR)((LPBYTE)el->er + el->er->StringOffset);
                el_string[0] = '\0';

                for (nstr = 0;nstr < el->er->NumStrings;nstr++)
                {
                    str_size = strlen(sstr); 
                    strncat(el_string, sstr, size_left);

                    tmp_str= strchr(el_string, '\0');
                    if(tmp_str)
                    {
                        *tmp_str = ' ';  
                        tmp_str++; *tmp_str = '\0';
                    }
                    size_left-=str_size + 1;

                    if(nstr <= 54)
                        el_sstring[nstr] = (LPSTR)sstr;

                    sstr = strchr( (LPSTR)sstr, '\0');
                    sstr++;
     
                }

                //Get a more descriptive message (if available)
                event_descriptive_msg = El_GetMessage(el->er, el->event_name, event_sourcename, el_sstring);
                if(event_descriptive_msg != NULL)
                {
                    // Remove any \n or \r
                    tmp_str = event_descriptive_msg;   
                    while((tmp_str = strchr(tmp_str, '\n')))
                    {
                        *tmp_str = ' ';
                        tmp_str++;
           
                    }   

                    tmp_str = event_descriptive_msg;   
                    while((tmp_str = strchr(tmp_str, '\r')))
                    {
                        *tmp_str = ' ';
                        tmp_str++;
      //strchr(tmp_str, '\n');

                    }   
                }
            }
            else
            {
                strncpy(el_string, "(no message)", 1020); 
            }


            // 得到username
            if (el->er->UserSidLength)
            {
                SID_NAME_USE account_type;
                if(!LookupAccountSid(NULL, (SID *)((LPSTR)el->er + el->er->UserSidOffset),
                            event_el_user, &user_size, event_el_domain, &domain_size, &account_type))  
                {
                    strncpy(event_el_user, "(no user)", 255);
                    strncpy(event_el_domain, "no domain", 255);
                }

            }

            else
            {
                strncpy(event_el_user, "A", 255); 
                strncpy(event_el_domain, "N", 255); 
            }

            if(printit)
            {
                tm   *event_time   =   localtime((const   long   *)&el->er->TimeWritten);

                _snprintf(final_out_msg, 1022,
                        "事件记录序号:%d\n事件:%s\n日期:%.4hd-%2hd-%2hd\n时间:%.2hd:%.2hd:%.2hd\n事件类型:%s\n事件来源:%s\n事件ID:(%u)\n用户:%s/%s\n计算机:%s\n描述:\n%s\n\n\n",
      event_record,
      el->event_name,
      event_time->tm_year + 1900,
      event_time->tm_mon + 1,
      event_time->tm_mday,
      event_time->tm_hour,
      event_time->tm_min,
      event_time->tm_sec, 
      
                        event_category,
      event_sourcename,
                       
                        (WORD)el->er->EventID,
                        event_el_domain,
                        event_el_user,
                       
      event_computername,
                        event_descriptive_msg != NULL?event_descriptive_msg:el_string); 
              
         fprintf(fp, "%s\n", final_out_msg); 
            }

            if(event_descriptive_msg != NULL)
                LocalFree(event_descriptive_msg);

            // Changing the point to the er
            read -= el->er->Length;
            el->er = (EVENTLOGRECORD *)((LPBYTE) el->er + el->er->Length);
   event_record++;
        }  

        // Setting er to the beginning of the buffer  
        el->er = (EVENTLOGRECORD *)&mbuffer;
  
    }
}
//////////////////////////////////////////////////////////////////////

void CRead_EventDlg::Save_Application()
{
 //从列表中保存应用日志
 if(!fp)
 {
  MessageBox("怎么没打开呢!","警告!",MB_OK|MB_ICONEXCLAMATION);
  exit(1);
 }
 else
 {
  MessageBox("应用日志文件打开了!","信息!",MB_OK|MB_ICONINFORMATION);
 }

 fprintf(fp, "\n\n***********应用日志列表***********\n\n\n");
 Save_List(1,event_record);

 fclose(fp);
 if(fclose(fp))
 {
  MessageBox("应用日志文件关闭了!","信息!",MB_OK|MB_ICONINFORMATION); 
 }
 else
 {
  MessageBox("还开着呢了,,抓紧关它吧!","错误!",MB_OK|MB_ICONSTOP);  

 }

}
//////////////////////////////////////////////////////////////////

void CRead_EventDlg::Save_Security()
{
 //从列表中保存安全日志
 if(!fp)
 {
  MessageBox("怎么没打开呢!","警告!",MB_OK|MB_ICONEXCLAMATION);

  exit(1);
 }
 else
 {
  
  MessageBox("安全日志文件打开了!","信息!",MB_OK|MB_ICONINFORMATION);

 }


 fprintf(fp, "\n\n***********安全日志列表***********\n\n\n"); 

 Save_List(1,event_record);

 fclose(fp);
 if(fclose(fp))
 {
  MessageBox("安全日志文件关闭了!","信息!",MB_OK|MB_ICONINFORMATION);
 }
 else
 {
  MessageBox("还开着呢了,,抓紧关它吧!","错误!",MB_OK|MB_ICONSTOP);
 }

}
////////////////////////////////////////////////////
void CRead_EventDlg::Save_System()
{
 //从列表中保存系统日志
 if(!fp)
 {
  MessageBox("怎么没打开呢!","警告!",MB_OK|MB_ICONEXCLAMATION);
  exit(1);
 }
 else
 {
  MessageBox("系统日志文件打开了!","信息!",MB_OK|MB_ICONINFORMATION);
 }
 fprintf(fp, "\n\n***********系统日志列表***********\n\n\n"); 

 Save_List(1,event_record);

 fclose(fp);
 if(fclose(fp))
 {
  MessageBox("系统日志文件关闭了!","信息!",MB_OK|MB_ICONINFORMATION);  
 }
 else
 {
  MessageBox("还开着呢了,,抓紧关它吧!","错误!",MB_OK|MB_ICONSTOP);
 }

}
/////////////////////////////////////////////////////////////////////////
void CRead_EventDlg::Save_Single_Record(int single_record)
{
 //从列表中保存单个记录
 if(!fp)
 {
  MessageBox("怎么没打开呢!","警告!",MB_OK|MB_ICONEXCLAMATION);  
  exit(1);
 }
 else
 {
  MessageBox("一个记录正要保存了!","信息!",MB_OK|MB_ICONINFORMATION);  
 }

 fprintf(fp, "\n\n***********第%d记录***********\n\n\n",nItem);
 
 Save_List(single_record,single_record);


 fclose(fp);
 if(fclose(fp))
 {
  MessageBox("日志记录关闭了!","信息!",MB_OK|MB_ICONINFORMATION); 
 }
 else
 {
  MessageBox("还有一个记录开着呢!","错误!",MB_OK|MB_ICONSTOP);  
 }
}
/////////////////////////////////////////////////////////////////////
void CRead_EventDlg::Save_List(int record_initialize, int record_num)
{
 //保存列表记录
 CString save_event_record;
 CString save_event_category;
 CString save_event_sourcename;
 CString save_event_date;
 CString save_event_time;
 CString save_event_id;
 CString save_event_user;
 CString save_event_computername;
 CString save_event_descriptive_msg;
 CString save_event_name;
 
 switch(istype)
 {
 case 1:
  save_event_name="Security";
  break;
 case 2:
  save_event_name="System";
  break;
 case 3:
  save_event_name="Application";
  break;
 default:
  return;
   }

 for(int i=record_initialize-1;i<record_num;i++)
 {
  save_event_record=m_mm_host_ListCtrl.GetItemText(i,0);
  save_event_category=m_mm_host_ListCtrl.GetItemText(i,1);
  save_event_sourcename=m_mm_host_ListCtrl.GetItemText(i,2);
  save_event_date=m_mm_host_ListCtrl.GetItemText(i,3);
  save_event_time=m_mm_host_ListCtrl.GetItemText(i,4);
  save_event_id=m_mm_host_ListCtrl.GetItemText(i,5);
  save_event_user=m_mm_host_ListCtrl.GetItemText(i,6);
  save_event_computername=m_mm_host_ListCtrl.GetItemText(i,7);
  save_event_descriptive_msg=m_mm_host_ListCtrl.GetItemText(i,8);
  fprintf(fp, "事件记录序号:%s\n事件:%s\n日期:%s\n时间:%s\n类型:%s\n事件来源:%s\n事件ID:%s\n用户:%s\n计算机:%s\n描述:\n%s\n\n\n\n",
    save_event_record,
    save_event_name,
    save_event_date,
    save_event_time,
    save_event_category,
    save_event_sourcename,
    save_event_id,
    save_event_user,
    save_event_computername,
    save_event_descriptive_msg);

 }

}
////////////////////////////////////////////////////
void CRead_EventDlg::Save_Hard_Application()
{
 //从系统中保存应用日志
 if(!fp)
 {
  MessageBox("怎么没打开呢!","警告!",MB_OK|MB_ICONEXCLAMATION);
  exit(1);
 }
 else
 {
  MessageBox("应用日志文件打开了!","信息!",MB_OK|MB_ICONINFORMATION);
 }

 fprintf(fp, "\n\n***********应用日志列表***********\n\n\n");
 
 Start_EL("application",el);
 Save_event(el, 1);
 
 fclose(fp);
 if(fclose(fp))
 {
  MessageBox("应用日志文件关闭了!","信息!",MB_OK|MB_ICONINFORMATION); 
 }
 else
 {
  MessageBox("还开着呢了,,抓紧关它吧!","错误!",MB_OK|MB_ICONSTOP);  

 }

}
////////////////////////////////////////////////////////////////////


void CRead_EventDlg::Save_Hard_Security()
{
 //从系统中保存安全记录
 if(!fp)
 {
  MessageBox("怎么没打开呢!","警告!",MB_OK|MB_ICONEXCLAMATION);

  exit(1);
 }
 else
 {
  
  MessageBox("安全日志文件打开了!","信息!",MB_OK|MB_ICONINFORMATION);

 }


 fprintf(fp, "\n\n***********安全日志列表***********\n\n\n"); 

 Start_EL("Security",el);
 Save_event(el, 1);

 fclose(fp);
 if(fclose(fp))
 {
  MessageBox("安全日志文件关闭了!","信息!",MB_OK|MB_ICONINFORMATION);
 }
 else
 {
  MessageBox("还开着呢了,,抓紧关它吧!","错误!",MB_OK|MB_ICONSTOP);
 }
}
//////////////////////////////////////////////////////////////
void CRead_EventDlg::Save_Hard_System()
{
 //从系统中保存系统日志
 if(!fp)
 {
  MessageBox("怎么没打开呢!","警告!",MB_OK|MB_ICONEXCLAMATION);
  exit(1);
 }
 else
 {
  MessageBox("系统日志文件打开了!","信息!",MB_OK|MB_ICONINFORMATION);
 }

 fprintf(fp, "\n\n***********系统日志列表***********\n\n\n"); 

 Start_EL("System",el);
 Save_event(el, 1);

 fclose(fp);
 if(fclose(fp))
 {
  MessageBox("系统日志文件关闭了!","信息!",MB_OK|MB_ICONINFORMATION);  
 }
 else
 {
  MessageBox("还开着呢了,,抓紧关它吧!","错误!",MB_OK|MB_ICONSTOP);
 }

}
/////////////////////////////////////////////////////////////////

void CRead_EventDlg::OnSave_Hard()
{
 //从系统中保存记录的响应函数
 // TODO: Add your control notification handler code here
 switch(istype)
 {
 case 1:
  break;
 case 2:
  break;
 case 3:
  break;
 default:
  MessageBox("请选择日志类型","警告!",MB_OK|MB_ICONEXCLAMATION);
  return;
   }

 CString sFileName;
 sFileName.Format("");

 CFileDialog dlg(FALSE, "txt", sFileName,
     OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,
     "文本文件(*.txt)|*.txt|文本文件(*.doc)|*.doc||", this); 

 /////////////////////////////////////////
 //从系统中保存整个日志
 if(IDCANCEL==(MessageBox("您确定要从系统中保存日志文件?","提示!",MB_OKCANCEL|MB_ICONQUESTION)))
 {
  nItem=0;
  return;
 }

 if (dlg.DoModal() == IDOK)
 {
  dlg.m_ofn.lpstrTitle = _T("从系统中保存日志文件");
  CString fileName = dlg.GetPathName();

  fp = fopen(fileName,"w");
  switch(istype)
  {
  case 1:
   Save_Hard_Security();
   break;
  case 2:
   Save_Hard_System();
   break;
  case 3:
   Save_Hard_Application();
   break;
  default:
   MessageBox("请选择日志类型","警告!",MB_OK|MB_ICONEXCLAMATION);
   return;
    }
 }
 nItem=0;
 
}
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
// DescriptionDiaLog.cpp : implementation file
//

#include "stdafx.h"
#include "Read_Event.h"
#include "DescriptionDiaLog.h"
#include "Read_EventDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern int istype;
extern int nItem;
extern int event_record;
extern CString m_mm_host_state;
extern os_el el[1];
extern BOOL issub;
BOOL isShow=FALSE;
/////////////////////////////////////////////////////////////////////////////
// DescriptionDiaLog dialog


DescriptionDiaLog::DescriptionDiaLog(CWnd* pParent /*=NULL*/)
 : CDialog(DescriptionDiaLog::IDD, pParent)
{
 //{{AFX_DATA_INIT(DescriptionDiaLog)
 m_sub_event_computername = _T("");
 //}}AFX_DATA_INIT
}


void DescriptionDiaLog::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(DescriptionDiaLog)
 DDX_Text(pDX, IDC_SBUEVENTCOMPUTERNAME, m_sub_event_computername);
 //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(DescriptionDiaLog, CDialog)
 //{{AFX_MSG_MAP(DescriptionDiaLog)
 ON_BN_CLICKED(IDC_SHOW, OnShow)
 ON_BN_CLICKED(IDC_PRESHOW, OnPreshow)
 ON_BN_CLICKED(IDC_NEXTSHOW, OnNextshow)
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// DescriptionDiaLog message handlers

BOOL DescriptionDiaLog::OnInitDialog()
{
 CDialog::OnInitDialog();
 
 // TODO: Add extra initialization here
 issub=true;
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}
//////////////////////////////////////////////////////////
void DescriptionDiaLog::Sub_Prepare()
{

 char *m_sub_cTemp;
 switch(istype)
 {
 case 1:
  m_sub_cTemp ="Security";
  break;
 case 2:
  m_sub_cTemp ="System";
  break;
 default:
  m_sub_cTemp ="application";
 }
 Sub_Show(nItem);
}
///////////////////////////////////////////////////////
void DescriptionDiaLog::OnShow()
{
 //显示记录内容
 // TODO: Add your control notification handler code here
 //判断是否有记录被选中
 if (nItem==0)
 {
  MessageBox("错了!","错误!",MB_OK|MB_ICONSTOP);
  CDialog::OnOK();
 }
 //如果是选中的是列表中第一条记录,向前观察按钮失效
 if(nItem==1)
 {
  GetDlgItem(IDC_PRESHOW)->EnableWindow(FALSE);
  GetDlgItem(IDC_NEXTSHOW)->EnableWindow(TRUE);
 }
 //如果是选中的是列表中最后一条记录,向后观察按钮失效
 if(nItem==event_record)
 {
  GetDlgItem(IDC_PRESHOW)->EnableWindow(TRUE);
  GetDlgItem(IDC_NEXTSHOW)->EnableWindow(FALSE);
 }
 Sub_Prepare();
 isShow=TRUE;
}
///////////////////////////////////////////////////////////
void DescriptionDiaLog::OnPreshow()

 //向前观察按钮响应函数
 // TODO: Add your control notification handler code here
 if (!isShow)
 {
  MessageBox("请回去选择记录!","警告!",MB_OK|MB_ICONEXCLAMATION);
  CDialog::OnOK();
 }
 nItem--;
 //如果是选中的是列表中第一条记录,向前观察按钮失效
 if(nItem==1)
 {
  GetDlgItem(IDC_PRESHOW)->EnableWindow(FALSE);
 }
 GetDlgItem(IDC_NEXTSHOW)->EnableWindow(TRUE);
 Sub_Prepare();

}
//////////////////////////////////////////////////////////////////
void DescriptionDiaLog::OnNextshow()

 //向后观察按钮
 // TODO: Add your control notification handler code here
 nItem++;
 //如果是选中的是列表中最后一条记录,向后观察按钮失效
 if(nItem==event_record)
 {
  GetDlgItem(IDC_NEXTSHOW)->EnableWindow(FALSE);
 }
 GetDlgItem(IDC_PRESHOW)->EnableWindow(TRUE);
 Sub_Prepare();

}
//////////////////////////////////////////////////////////////

void DescriptionDiaLog::OnOK()
{
 // TODO: Add extra validation here
 nItem=0;
 CDialog::OnOK();
}

void DescriptionDiaLog::OnCancel()
{
 // TODO: Add extra cleanup here
 nItem=0;
 CDialog::OnCancel();
}
////////////////////////////////////////////////////////////////
void DescriptionDiaLog::Sub_Show(int sub_nItem)
{
 //显示详细记录按钮的响应函数
 CRead_EventDlg* dlg = (CRead_EventDlg *)AfxGetMainWnd();
 CString sub_event;

 //事件序列
 sub_event=dlg->m_mm_host_ListCtrl.GetItemText(sub_nItem-1,0);
 GetDlgItem(IDC_SBUEVENTRECORD)->SetWindowText(sub_event);
 //事件类型
 sub_event=dlg->m_mm_host_ListCtrl.GetItemText(sub_nItem-1,1);
 GetDlgItem(IDC_SBUEVENTCATEGORY)->SetWindowText(sub_event);
 //事件来源
 sub_event=dlg->m_mm_host_ListCtrl.GetItemText(sub_nItem-1,2);
 GetDlgItem(IDC_SUBEVENTSOURCENAME)->SetWindowText(sub_event);
 //事件日期
 sub_event=dlg->m_mm_host_ListCtrl.GetItemText(sub_nItem-1,3);
 GetDlgItem(IDC_SUBEVENTDATA)->SetWindowText(sub_event);
 //事件时间
 sub_event=dlg->m_mm_host_ListCtrl.GetItemText(sub_nItem-1,4);
 GetDlgItem(IDC_SBUEVENTTIME)->SetWindowText(sub_event);
 //事件ID
 sub_event=dlg->m_mm_host_ListCtrl.GetItemText(sub_nItem-1,5);
 GetDlgItem(IDC_SBUEVENTID)->SetWindowText(sub_event);
 //用户
 sub_event=dlg->m_mm_host_ListCtrl.GetItemText(sub_nItem-1,6);
 GetDlgItem(IDC_SBUEVENTUSERNAME)->SetWindowText(sub_event);
 //计算机
 sub_event=dlg->m_mm_host_ListCtrl.GetItemText(sub_nItem-1,7);
 GetDlgItem(IDC_SBUEVENTCOMPUTERNAME)->SetWindowText(sub_event);
 //详细描述
 sub_event=dlg->m_mm_host_ListCtrl.GetItemText(sub_nItem-1,8);
 GetDlgItem(IDC_EDIT_SBUEVENTMESSAGE)->SetWindowText(sub_event);
 
 switch(istype)
 {
 case 1:
  sub_event="Security";
  break;
 case 2:
  sub_event="System";
  break;
 case 3:
  sub_event="Application";
  break;
 default:
  MessageBox("请选择日志类型!","警告!",MB_OK|MB_ICONEXCLAMATION);
  return;
   }
 //事件
 GetDlgItem(IDC_SUBEVENT)->SetWindowText(sub_event);

}
/////////////////////////////////////////////////////////////////

posted @ 2006-09-07 14:37 啤酒 阅读(797) | 评论 (0)编辑 收藏

2006年9月6日

文件类型操作

取得文件名
{
      CString
      FilePathName;
      CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框
      if(dlg.DoModal()==IDOK)
      FilePathName=dlg.GetPathName();
}
相关信息:CFileDialog 用于取文件名的几个成员函数:
假如选择的文件是C:\WINDOWS\TEST.EXE
则:
   (1)GetPathName();取文件名全称,包括完整路径。取回C:\WINDOWS\TEST.EXE
   (2)GetFileTitle();取回TEST
   (3)GetFileName();取文件全名:TEST.EXE
   (4)GetFileExt();取扩展名EXE
 
打开文件
CFile file("C:\HELLO.TXT",CFile::modeRead);///只读方式打开
///CFile::modeRead可改为 CFile::modeWrite(只写),CFile::modeReadWrite(读写),CFile::modeCreate(新建)
例子:
{
    CFile file;
    file.Open("C:\HELLO.TXT",CFile::modeCreate|Cfile::modeWrite);
    ...
    ...
}
 
移动文件指针
    file.Seek(100,CFile::begin);///从文件头开始往下移动100字节
    file.Seek(-50,CFile::end);///从文件末尾往上移动50字节
    file.Seek(-30,CFile::current);///从当前位置往上移动30字节
    file.SeekToBegin();///移到文件头
    file.SeekToEnd();///移到文件尾

对于CFileDialog 使用可参照下面

:通用对话框的使用
    大家都遇到过CFileDialog文件对话框吧,它的参数让人头疼.下面解除大家的头疼.
    先在使用文件对话框的类的类定义文件中加入对象定义CFileDialog m_MyOpenDialog(TRUE,"avi","*.avi")。随后,在需要使用该对话框的地方加入以下语句:
    m_MyOpenDialog.Domodal();
    就可以预览所有.avi文件.

    其调用规则为:
    函数原型:
    CFileDialog(BOOL bOpenFileDialog,LPCTSTR lpszDefExt=NULL,LPCTSTR lpszFileName=NULL,DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPR OMPT,LPCTSTR lpszFilter=NULL,CWnd * pParentWnd
=NULL);
    参数说明:
    bOpenFileDialog:为TRUE或FALSE。TRUE为打开文件;FALSE为保存文件。
    lpszDefExt     :为缺省的扩展名。
    lpszFileName   :为显示在文件名组合框的编辑框的文件名,一般可选NULL
    dwFlags        :为对话框风格,一般为OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,即隐藏只读选项和覆盖已有文件前提示。
    LpszFilter     :为下拉列表枢中显示文件类型。
    pParentWnd     :一般可选NULL。
    例如:在文件类型列表框的编辑框要显示“可执行文件(*.exe)”,而在它的下拉列表框中列出“视频文件(*.avi)、All Files(*.*)”内容,则变量定义如下:CFileDialog m_MyOpenDialog(TRUE,"exe",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"可执行文件(*.exe) | *.exe|视频文件(*.bat) | *.bat |All Files (*.*) | *.* ||",NULL);
    注:看看没有*.*后的||会是什么效果.

关于:fseek

fseek()函数有三个参数


第一个是文件的指针


第二个是偏移量  也就是指针移动的字符数 

   //这个参数必须是L类型

   //如果是负数  表示指针反向移动(向文件头的方向)


第三个是偏移量的相对开始位置

0  表示从文件开始处  偏移 L

1  表示从当前位置    偏移 L

2  表示从文件末尾    偏移 L  //只能是负数了  也就是只能前向移动
fseek
Moves the file pointer to a specified location.

int fseek(
   FILE *stream,
   long offset,
   int origin
);
Parameters
stream
Pointer to FILE structure.
offset
Number of bytes from origin.
origin
Initial position.
Return Value
If successful, fseek returns 0. Otherwise, it returns a nonzero value. On devices incapable of seeking, the return value is undefined.

Remarks
The fseek function moves the file pointer (if any) associated with stream to a new location that is offset bytes from origin. The next operation on the stream takes place at the new location. On a stream open for update, the next operation can be either a read or a write. The argument origin must be one of the following constants, defined in STDIO.H:

SEEK_CUR
Current position of file pointer.
SEEK_END
End of file.
SEEK_SET
Beginning of file.

再转一片文章:

c中的文件操作
1
C 的文件操作/TD>
 
文件

文件的基本概念
  所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。

  普通文件是指驻留在磁盘或其它外部介质上的一个有序数据集,可以是源文件、目标文件、可执行程序; 也可以是一组待输入处理的原始数据,或者是一组输出的结果。对于源文件、目标文件、 可执行程序可以称作程序文件,对输入输出数据可称作数据文件。

  设备文件是指与主机相联的各种外部设备,如显示器、打印机、键盘等。在操作系统中,把外部设备也看作是一个文件来进行管理,把它们的输入、输出等同于对磁盘文件的读和写。 通常把显示器定义为标准输出文件, 一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用的printf,putchar 函数就是这类输出。键盘通常被指定标准的输入文件, 从键盘上输入就意味着从标准输入文件上输入数据。scanf,getchar函数就属于这类输入。 

  从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。

  ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:
ASC码:  00110101 00110110 00110111 00111000
     ↓     ↓    ↓    ↓
十进制码: 5     6    7    8 共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。

  二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的存储形式为: 00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示, 但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。 因此也把这种文件称作“流式文件”。

  本章讨论流式文件的打开、关闭、读、写、 定位等各种操作。文件指针在C语言中用一个指针变量指向一个文件, 这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。 定义说明文件指针的一般形式为: FILE* 指针变量标识符; 其中FILE应为大写,它实际上是由系统定义的一个结构, 该结构中含有文件名、文件状态和文件当前位置等信息。 在编写源程序时不必关心FILE结构的细节。例如:FILE *fp; 表示fp是指向FILE结构的指针变量,通过fp 即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件, 实施对文件的操作。习惯上也笼统地把fp称为指向一个文件的指针。文件的打开与关闭文件在进行读写操作之前要先打开,使用完毕要关闭。 所谓打开文件,实际上是建立文件的各种有关信息, 并使文件指针指向该文件,以便进行其它操作。关闭文件则断开指针与文件之间的联系,也就禁止再对该文件进行操作。

  在C语言中,文件操作都是由库函数来完成的。 在本章内将介绍主要的文件操作函数。

文件打开函数fopen

  fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式) 其中,“文件指针名”必须是被说明为FILE 类型的指针变量,“文件名”是被打开文件的文件名。 “使用文件方式”是指文件的类型和操作要求。“文件名”是字符串常量或字符串数组。例如: 
FILE *fp;
fp=("file a","r");
其意义是在当前目录下打开文件file a, 只允许进行“读”操作,并使fp指向该文件。
 
 
 
 
2
C 的文件操作/TD>
 
又如:
FILE *fphzk
fphzk=("c:\\hzk16',"rb")
其意义是打开C驱动器磁盘的根目录下的文件hzk16, 这是一个二进制文件,只允许按二进制方式进行读操作。两个反斜线“\\ ”中的第一个表示转义字符,第二个表示根目录。使用文件的方式共有12种,下面给出了它们的符号和意义。 
文件使用方式        意 义
“rt”      只读打开一个文本文件,只允许读数据 
“wt”      只写打开或建立一个文本文件,只允许写数据
“at”      追加打开一个文本文件,并在文件末尾写数据
“rb”      只读打开一个二进制文件,只允许读数据
“wb”       只写打开或建立一个二进制文件,只允许写数据
“ab”       追加打开一个二进制文件,并在文件末尾写数据
“rt+”      读写打开一个文本文件,允许读和写
“wt+”      读写打开或建立一个文本文件,允许读写
“at+”      读写打开一个文本文件,允许读,或在文件末追加数 据
“rb+”      读写打开一个二进制文件,允许读和写 
“wb+”      读写打开或建立一个二进制文件,允许读和写
“ab+”      读写打开一个二进制文件,允许读,或在文件末追加数据

对于文件使用方式有以下几点说明:
1. 文件使用方式由r,w,a,t,b,+六个字符拼成,各字符的含义是:
r(read): 读
w(write): 写
a(append): 追加
t(text): 文本文件,可省略不写
b(banary): 二进制文件
+: 读和写

2. 凡用“r”打开一个文件时,该文件必须已经存在, 且只能从该文件读出。

3. 用“w”打开的文件只能向该文件写入。 若打开的文件不存在,则以指定的文件名建立该文件,若打开的文件已经存在,则将该文件删去,重建一个新文件。

4. 若要向一个已存在的文件追加新的信息,只能用“a ”方式打开文件。但此时该文件必须是存在的,否则将会出错。

5. 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:
if((fp=fopen("c:\\hzk16","rb")==NULL)
{
printf("\nerror on open c:\\hzk16 file!");
getch();
exit(1);
}
  这段程序的意义是,如果返回的指针为空,表示不能打开C盘根目录下的hzk16文件,则给出提示信息“error on open c:\ hzk16file!”,下一行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待, 只有当用户从键盘敲任一键时,程序才继续执行, 因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。

6. 把一个文本文件读入内存时,要将ASCII码转换成二进制码, 而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。

7. 标准输入文件(键盘),标准输出文件(显示器 ),标准出错输出(出错信息)是由系统打开的,可直接使用。文件关闭函数fclose文件一旦使用完毕,应用关闭文件函数把文件关闭, 以避免文件的数据丢失等错误。

fclose函数

调用的一般形式是: fclose(文件指针); 例如:
fclose(fp); 正常完成关闭文件操作时,fclose函数返回值为0。如返回非零值则表示有错误发生。文件的读写对文件的读和写是最常用的文件操作。 

在C语言中提供了多种文件读写的函数: 
·字符读写函数 :fgetc和fputc
·字符串读写函数:fgets和fputs
·数据块读写函数:freed和fwrite
·格式化读写函数:fscanf和fprinf

  下面分别予以介绍。使用以上函数都要求包含头文件stdio.h。字符读写函数fgetc和fputc字符读写函数是以字符(字节)为单位的读写函数。 每次可从文件读出或向文件写入一个字符。
 
 
 
 
3
C 的文件操作/TD>
 

一、读字符函数fgetc

  fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为: 字符变量=fgetc(文件指针); 例如:ch=fgetc(fp);其意义是从打开的文件fp中读取一个字符并送入ch中。

  对于fgetc函数的使用有以下几点说明:
1. 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。

2. 读取字符的结果也可以不向字符变量赋值,例如:fgetc(fp);但是读出的字符不能保存。

3. 在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后, 该位置指针将向后移动一个字节。 因此可连续多次使用fgetc函数,读取多个字符。 应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。

[例10.1]读入文件e10-1.c,在屏幕上输出。
#include
main()
{
FILE *fp;
char ch;
if((fp=fopen("e10_1.c","rt"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
ch=fgetc(fp);
while (ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
fclose(fp);
}
  本例程序的功能是从文件中逐个读取字符,在屏幕上显示。 程序定义了文件指针fp,以读文本文件方式打开文件“e10_1.c”, 并使fp指向该文件。如打开文件出错, 给出提示并退出程序。程序第12行先读出一个字符,然后进入循环, 只要读出的字符不是文件结束标志(每个文件末有一结束标志EOF)就把该字符显示在屏幕上,再读入下一字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。执行本程序将显示整个文件。

二、写字符函数fputc

  fputc函数的功能是把一个字符写入指定的文件中,函数调用的 形式为: fputc(字符量,文件指针); 其中,待写入的字符量可以是字符常量或变量,例如:fputc('a',fp);其意义是把字符a写入fp所指向的文件中。

  对于fputc函数的使用也要说明几点:
1. 被写入的文件可以用、写、读写,追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。

2. 每写入一个字符,文件内部位置指针向后移动一个字节。

3. fputc函数有一个返回值,如写入成功则返回写入的字符, 否则返回一个EOF。可用此来判断写入是否成功。

[例10.2]从键盘输入一行字符,写入一个文件, 再把该文件内容读出显示在屏幕上。
#include
main()
{
FILE *fp;
char ch;
if((fp=fopen("string","wt+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input a string:\n");
ch=getchar();
while (ch!='\n')
{
fputc(ch,fp);
ch=getchar();
}
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf("\n");
fclose(fp);
}
  程序中第6行以读写文本文件方式打开文件string。程序第13行从键盘读入一个字符后进入循环,当读入字符不为回车符时, 则把该字符写入文件之中,然后继续从键盘读入下一字符。 每输入一个字符,文件内部位置指针向后移动一个字节。写入完毕, 该指针已指向文件末。如要把文件从头读出,须把指针移向文件头, 程序第19行rewind函数用于把fp所指文件的内部位置指针移到文件头。 第20至25行用于读出文件中的一行内容。

[例10.3]把命令行参数中的前一个文件名标识的文件, 复制到后一个文件名标识的文件中, 如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。
 
 
 
 
4
C 的文件操作/TD>
 
#include
main(int argc,char *argv[])
{
FILE *fp1,*fp2;
char ch;
if(argc==1)
{
printf("have not enter file name strike any key exit");
getch();
exit(0);
}
if((fp1=fopen(argv[1],"rt"))==NULL)
{
printf("Cannot open %s\n",argv[1]);
getch();
exit(1);
}
if(argc==2) fp2=stdout;
else if((fp2=fopen(argv[2],"wt+"))==NULL)
{
printf("Cannot open %s\n",argv[1]);
getch();
exit(1);
}
while((ch=fgetc(fp1))!=EOF)
fputc(ch,fp2);
fclose(fp1);
fclose(fp2);
}
  本程序为带参的main函数。程序中定义了两个文件指针 fp1 和fp2,分别指向命令行参数中给出的文件。如命令行参数中没有给出文件名,则给出提示信息。程序第18行表示如果只给出一个文件名,则使fp2指向标准输出文件(即显示器)。程序第25行至28行用循环语句逐个读出文件1中的字符再送到文件2中。再次运行时,给出了一个文件名(由例10.2所建立的文件), 故输出给标准输出文件stdout,即在显示器上显示文件内容。第三次运行,给出了二个文件名,因此把string中的内容读出,写入到OK之中。可用DOS命令type显示OK的内容:字符串读写函数fgets和fputs

一、读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针); 其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志'\0'。例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。
[例10.4]从e10_1.c文件中读入一个含10个字符的字符串。
#include
main()
{
FILE *fp;
char str[11];
if((fp=fopen("e10_1.c","rt"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
fgets(str,11,fp);
printf("%s",str);
fclose(fp);
}
  本例定义了一个字符数组str共11个字节,在以读文本文件方式打开文件e101.c后,从中读出10个字符送入str数组,在数组最后一个单元内将加上'\0',然后在屏幕上显示输出str数组。输出的十个字符正是例10.1程序的前十个字符。

  对fgets函数有两点说明:
1. 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。
2. fgets函数也有返回值,其返回值是字符数组的首地址。

二、写字符串函数fputs

fputs函数的功能是向指定的文件写入一个字符串,其调用形式为: fputs(字符串,文件指针) 其中字符串可以是字符串常量,也可以是字符数组名, 或指针 变量,例如:
fputs(“abcd“,fp);
其意义是把字符串“abcd”写入fp所指的文件之中。[例10.5]在例10.2中建立的文件string中追加一个字符串。
#include
main()
{
FILE *fp;
char ch,st[20];
if((fp=fopen("string","at+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("input a string:\n");
scanf("%s",st);
fputs(st,fp);
rewind(fp);
ch=fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch=fgetc(fp);
}
printf("\n");
fclose(fp);
}
  本例要求在string文件末加写字符串,因此,在程序第6行以追加读写文本文件的方式打开文件string 。 然后输入字符串, 并用fputs函数把该串写入文件string。在程序15行用rewind函数把文件内部位置指针移到文件首。 再进入循环逐个显示当前文件中的全部内容。

数据块读写函数fread和fwrite

  C语言还提供了用于整块数据的读写函数。 可用来读写一组数据,如一个数组元素,一个结构变量的值等。读数据块函数调用的一般形式为: fread(buffer,size,count,fp); 写数据块函数调用的一般形式为: fwrite(buffer,size,count,fp); 其中buffer是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。 size 表示数据块的字节数。count 表示要读写的数据块块数。fp 表示文件指针。
 
 
    
 
5
C 的文件操作/TD>
 
例如:
fread(fa,4,5,fp); 其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。
[例10.6]从键盘输入两个学生数据,写入一个文件中, 再读出这两个学生的数据显示在屏幕上。
#include
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boya[2],boyb[2],*pp,*qq;
main()
{
FILE *fp;
char ch;
int i;
pp=boya;
qq=boyb;
if((fp=fopen("stu_list","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("\ninput data\n");
for(i=0;i<2;i++,pp++)
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
pp=boya;
fwrite(pp,sizeof(struct stu),2,fp);
rewind(fp);
fread(qq,sizeof(struct stu),2,fp);
printf("\n\nname\tnumber age addr\n");
for(i=0;i<2;i++,qq++)
printf("%s\t%5d%7d%s\n",qq->name,qq->num,qq->age,qq->addr);
fclose(fp);
}
  本例程序定义了一个结构stu,说明了两个结构数组boya和 boyb以及两个结构指针变量pp和qq。pp指向boya,qq指向boyb。程序第16行以读写方式打开二进制文件“stu_list”,输入二个学生数据之后,写入该文件中, 然后把文件内部位置指针移到文件首,读出两块学生数据后,在屏幕上显示。

格式化读写函数fscanf和fprintf

fscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。 两者的区别在于 fscanf 函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。这两个函数的调用格式为: fscanf(文件指针,格式字符串,输入表列); fprintf(文件指针,格式字符串,输出表列); 例如:
fscanf(fp,"%d%s",&i,s);
fprintf(fp,"%d%c",j,ch); 
用fscanf和fprintf函数也可以完成例10.6的问题。修改后的程序如例10.7所示。
[例10.7]
#include
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boya[2],boyb[2],*pp,*qq;
main()
{
FILE *fp;
char ch;
int i;
pp=boya;
qq=boyb;
if((fp=fopen("stu_list","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
printf("\ninput data\n");
for(i=0;i<2;i++,pp++)
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
pp=boya;
for(i=0;i<2;i++,pp++)
fprintf(fp,"%s %d %d %s\n",pp->name,pp->num,pp->age,pp->
addr);
rewind(fp);
for(i=0;i<2;i++,qq++)
fscanf(fp,"%s %d %d %s\n",qq->name,&qq->num,&qq->age,qq->addr);
printf("\n\nname\tnumber age addr\n");
qq=boyb;
for(i=0;i<2;i++,qq++)
printf("%s\t%5d %7d %s\n",qq->name,qq->num, qq->age,
qq->addr);
fclose(fp);
}
  与例10.6相比,本程序中fscanf和fprintf函数每次只能读写一个结构数组元素,因此采用了循环语句来读写全部数组元素。 还要注意指针变量pp,qq由于循环改变了它们的值,因此在程序的25和32行分别对它们重新赋予了数组的首地址。

文件的随机读写

  前面介绍的对文件的读写方式都是顺序读写, 即读写文件只能从头开始,顺序读写各个数据。 但在实际问题中常要求只读写文件中某一指定的部分。 为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。 实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位移动文件内部位置指针的函数主要有两个, 即 rewind 函数和fseek函数。

  rewind函数前面已多次使用过,其调用形式为: rewind(文件指针); 它的功能是把文件内部的位置指针移到文件首。 下面主要介绍
fseek函数。

  fseek函数用来移动文件内部位置指针,其调用形式为: fseek(文件指针,位移量,起始点); 其中:“文件指针”指向被移动的文件。 “位移量”表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64KB 时不会出错。当用常量表示位移量时,要求加后缀“L”。“起始点”表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。
 
 
    
 
6
C 的文件操作/TD>
 
其表示方法如表10.2。 
起始点    表示符号    数字表示
——————————————————————————
文件首    SEEK—SET    0
当前位置   SEEK—CUR    1
文件末尾   SEEK—END     2
例如:
fseek(fp,100L,0);其意义是把位置指针移到离文件首100个字节处。还要说明的是fseek函数一般用于二进制文件。在文本文件中由于要进行转换,故往往计算的位置会出现错误。文件的随机读写在移动位置指针之后, 即可用前面介绍的任一种读写函数进行读写。由于一般是读写一个数据据块,因此常用fread和fwrite函数。下面用例题来说明文件的随机读写。

[例10.8]在学生文件stu list中读出第二个学生的数据。
#include
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boy,*qq;
main()
{
FILE *fp;
char ch;
int i=1;
qq=&boy;
if((fp=fopen("stu_list","rb"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
rewind(fp);
fseek(fp,i*sizeof(struct stu),0);
fread(qq,sizeof(struct stu),1,fp);
printf("\n\nname\tnumber age addr\n");
printf("%s\t%5d %7d %s\n",qq->name,qq->num,qq->age,
qq->addr);
}
  文件stu_list已由例10.6的程序建立,本程序用随机读出的方法读出第二个学生的数据。程序中定义boy为stu类型变量,qq为指向boy的指针。以读二进制文件方式打开文件,程序第22行移动文件位置指针。其中的i值为1,表示从文件头开始,移动一个stu类型的长度, 然后再读出的数据即为第二个学生的数据。

文件检测函数

C语言中常用的文件检测函数有以下几个。
一、文件结束检测函数feof函数调用格式: feof(文件指针); 
功能:判断文件是否处于文件结束位置,如文件结束,则返回值为1,否则为0。

二、读写文件出错检测函数ferror函数调用格式: ferror(文件指针); 
功能:检查文件在用各种输入输出函数进行读写时是否出错。 如ferror返回值为0表示未出错,否则表示有错。

三、文件出错标志和文件结束标志置0函数clearerr函数调用格式: clearerr(文件指针); 
功能:本函数用于清除出错标志和文件结束标志,使它们为0值。

C库文件

C系统提供了丰富的系统文件,称为库文件,C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件, 在前面的包含命令中我们已多次使用过。在".h"文件中包含了常量定义、 类型定义、宏定义、函数原型以及各种编译选择设置等信息。另一类是函数库,包括了各种函数的目标代码,供用户在程序中调用。 通常在程序中调用一个库函数时,要在调用之前包含该函数原型所在的".h" 文件。
在附录中给出了全部库函数。
ALLOC.H    说明内存管理函数(分配、释放等)。
ASSERT.H    定义 assert调试宏。
BIOS.H     说明调用IBM—PC ROM BIOS子程序的各个函数。
CONIO.H    说明调用DOS控制台I/O子程序的各个函数。
CTYPE.H    包含有关字符分类及转换的名类信息(如 isalpha和toascii等)。
DIR.H     包含有关目录和路径的结构、宏定义和函数。
DOS.H     定义和说明MSDOS和8086调用的一些常量和函数。
ERRON.H    定义错误代码的助记符。
FCNTL.H    定义在与open库子程序连接时的符号常量。
FLOAT.H    包含有关浮点运算的一些参数和函数。
GRAPHICS.H   说明有关图形功能的各个函数,图形错误代码的常量定义,正对不同驱动程序的各种颜色值,及函数用到的一些特殊结构。
IO.H      包含低级I/O子程序的结构和说明。
LIMIT.H    包含各环境参数、编译时间限制、数的范围等信息。
MATH.H     说明数学运算函数,还定了 HUGE VAL 宏, 说明了matherr和matherr子程序用到的特殊结构。
MEM.H     说明一些内存操作函数(其中大多数也在STRING.H 中说明)。
PROCESS.H   说明进程管理的各个函数,spawn…和EXEC …函数的结构说明。
SETJMP.H    定义longjmp和setjmp函数用到的jmp buf类型, 说明这两个函数。
SHARE.H    定义文件共享函数的参数。
SIGNAL.H    定义SIG[ZZ(Z] [ZZ)]IGN和SIG[ZZ(Z] [ZZ)]DFL常量,说明rajse和signal两个函数。
STDARG.H    定义读函数参数表的宏。(如vprintf,vscarf函数)。
STDDEF.H    定义一些公共数据类型和宏。
STDIO.H    定义Kernighan和Ritchie在Unix System V 中定义的标准和扩展的类型和宏。还定义标准I/O 预定义流:stdin,stdout和stderr,说明 I/O流子程序。
STDLIB.H    说明一些常用的子程序:转换子程序、搜索/ 排序子程序等。
STRING.H    说明一些串操作和内存操作函数。
SYS\STAT.H   定义在打开和创建文件时用到的一些符号常量。
SYS\TYPES.H  说明ftime函数和timeb结构。
SYS\TIME.H   定义时间的类型time[ZZ(Z] [ZZ)]t。
TIME.H     定义时间转换子程序asctime、localtime和gmtime的结构,ctime、 difftime、 gmtime、 localtime和stime用到的类型,并提供这些函数的原型。
VALUE.H    定义一些重要常量, 包括依赖于机器硬件的和为与Unix System V相兼容而说明的一些常量,包括浮点和双精度值的范围。

posted @ 2006-09-06 10:08 啤酒 阅读(872) | 评论 (0)编辑 收藏

仅列出标题  下一页

导航

统计

常用链接

留言簿(2)

随笔档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜