• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            啤酒

            一個空白者

             

            2007年4月24日

            國家重點實驗室名單


            國家重點實驗室名單




             

            中國科學院

            模式識別實驗室

            自動化研究所
            金屬材料疲勞與斷裂實驗室 金屬研究所
            傳感技術聯合實驗室   電子所、冶金所、半導體所等
            超導實驗室 物理所
            紅外物理實驗室 上海技術物理研究所
            生物大分子實驗室 生物物理研究所
            大氣數值模擬實驗室 大氣物理研究所
            波譜與原子分子物理實驗室 武漢物理研究所
            分子反應動力學實驗室 大連化學物理研究所、化學所
            腐蝕科學實驗室 金屬腐蝕與防護研究所
            科學與工程計算實驗室 計算數學與科學工程計算所
            信息功能材料實驗室 上海冶金所
            植物細胞與染色體工程實驗室 遺傳所
            黃土高原土壤侵蝕與旱地農業實驗室 西北水土保持所
            農業蟲害鼠害綜合治理實驗室 動物所
            煤炭轉化實驗室 山西煤化所
            火災科學實驗室 中國科技大學
            瞬態光學技術實驗室 西安光機所
            生化工程實驗室 化冶所
            微生物資源前期開發實驗室 微生物所
            微細加工光學技術實驗室 光電技術所
            工程塑料實驗室 化學所
            半導體超晶格實驗室 半導體研究所
            快速凝固非平衡合金實驗室 金屬研究所
            聲場與聲信息實驗室 聲學研究所
            淡水生態與生物技術實驗室 水生生物研究所
            羰基合成和選擇氧化實驗室 蘭州化物所
            大氣邊界層物理和化學實驗室 大氣所
            分子動態與穩態結構實驗室 化學研究所、北大
            催化基礎實驗室 大連化學物理研究所
            高性能陶瓷和超微結構實驗室 上海硅酸鹽研究所
            計劃生育生殖生物學實驗室 動物研究所
            表面物理實驗室 物理研究所、半導體所
            植物分子遺傳實驗室 上海植物生理研究所
            分子生物學實驗室 上海生物化學研究所
            生命有機化學實驗室 上海有機化學研究所
            氣體地球化學實驗室 蘭州地質研究所
            有機地球化學實驗室 廣州地球化學研究所
            資源與環境信息系統實驗室 地理研究所
            新藥研究實驗室 上海藥物研究所
            結構化學實驗室 福建物質結構研究所
            凍土工程實驗室 蘭州冰川凍土研究所
             

            教育部

            集成光電子學實驗室 清華、吉大、半導體研究所
            化學工程聯合實驗室 清華、天大、華東理工大學、浙大
            煤的燃燒實驗室 華中理工大學
            毫米波實驗室 東南大學
            應用表面物理實驗室 復旦大學
            材料復合新技術實驗室 武漢工業大學
            高分子材料工程實驗室 四川聯合大學
            晶體材料實驗室 山東大學
            計算機輔助設計與圖行學實驗室 浙江大學
            配位化學實驗室 南京大學
            土木工程防災實驗室 同濟大學
            固體微結構物理實驗室 南京大學
            固體表面物理化學實驗室 廈門大學
            智能技術與系統實驗室 清華大學
            內生金屬礦床成礦機制研究實驗室 南京大學
            暴雨監測和預測實驗室 北京大學
            醫藥生物技術實驗室 南京大學
            污染控制和資源化研究實驗室 同濟大學、南京大學
            生物反應器實驗室 華東化工學院
            微生物技術實驗室 山東大學
            生物防治實驗室 中山大學
            河口海岸動力沉積和動力地貌綜合實驗室 華東師范大學
            干旱農業生態實驗室 蘭州大學
            粉末冶金實驗室 中南工業大學
            新型陶瓷與精細工藝實驗室 清華大學
            凝固技術實驗室 西北工業大學
            新金屬材料實驗室 北京科技大學
            超硬材料實驗室 吉林大學
            理論化學計算實驗室 吉林大學
            吸咐分離功能高分子材料實驗室 南開大學
            染料、表面活性劑精細化工合成實驗室 大連理工大學
            重質油加工實驗室 石油大學
            稀土材料化學及應用實驗室 北京大學
            近代聲學實驗室 南京大學
            流體傳動及控制實驗室 浙江大學
            制漿造紙工程實驗室 華南理工大學
            纖維材料改性實驗室 中國紡織大學
            混凝土材料研究實驗室 同濟大學
            軟件開發環境實驗室 北京航空航天大學
            現代光學儀器實驗室 浙江大學
            精密測試技術及儀器實驗室 天津大學、清華大學
            文字信息處理技術實驗室 北京大學
            微波與數字通信技術實驗室 清華大學
            程控交換技術與通信網實驗室 北京郵電大學
            移動與多點無線電通信系統實驗室 東南大學
            區域光纖通信與相干光纖通信實驗室 北京大學、上海交通大學
            綜合業務網理論及關健技術實驗室 西安電子科技大學
            專用集成電路與系統實驗室 復旦大學
            寬帶光纖傳輸與通信系統技術實驗室 (成都)電子科技大學
            電力系統及大型發電設備安全實驗室 清華大學
            牽引動力實驗室 西南交通大學
            現代焊接生產技術實驗室 哈爾濱工業大學
            工業控制技術實驗室 浙江大學
            汽車安全與節能實驗室 清華大學
            振動沖擊噪聲實驗室 上海交通大學
            電力設備電氣絕緣實駿室 西安交通大學
            工業裝備結構分析實驗室 大連理工大學
            塑性成形模擬及模具技術實驗室 華中理工大學
            軋制技術及連軋自動化實驗室 東北大學
            汽車動態摸擬實驗室 吉林工業大學
            機械制造系統工程實驗室 西安交通大學
            爆炸災害預防、控制實驗室 北京理工大學
            生物膜與膜生物工程實驗室 清華、北大、動物所
            海洋工程實驗室 上海交通大學
            人工微結構和介觀物理實驗室 北京大學
            遺傳工程實驗室 復旦大學
            視覺聽覺信息處理實驗室 北京大學
            元素有機化學實驗室 南開大學
            應用有機化學實驗室 蘭州大學
            海岸和近海工程實驗室 大連理工大學
            蛋白質工程及植物基因工程實驗室 北京大學
            激光技術實驗室 華中理工大學
            煤的清潔燃燒技術實驗室 清華大學
            計算機軟件新技術實驗室 南京大學
            機械傳動實驗室 重慶大學
            動力工程多相流實驗室 西安交通大學
            硅材料科學實驗室 浙江大學
            磨擦學實驗室 清華大學
            機械結構強度與振動實驗室 西安交通大學
            金屬材料強度實驗室 西安交通大學
            金屬基復合材料實驗室 上海交通大學
            高速水力學實驗室 成都科技大學
            超快速激光光譜實驗室 中山大學
             

            農業部

            作物遺傳改良實驗室 華中農業大學
            農業生物技術實驗室 北京農業大學
            植物病蟲害生物學實驗室 中國農科院植保所
            獸醫生物技術實驗室 農科院哈爾濱獸醫所
            熱帶作物生物技術實驗室 華南熱作兩院
             

            衛生部

            病毒基因工程實驗室 預防醫科院病毒所
            天然藥物及仿生藥物實驗室 北京醫科大學
            醫學遺傳學實驗室 湖南醫科大學
            癌基因及相關基因實驗室 上海市腫瘤所
            分子腫瘤學實驗室 醫科院腫瘤所
            醫學神經生物學實驗室 上海醫科大學
            醫學分子生物學實驗室 醫科院基礎所
            計劃生育藥具實驗室 上海計劃生育研究所
            實驗血液學實驗室 醫科院血液所
             

            國家測繪局

            測繪遙感信息工程實驗室 武漢測繪科技大學

            posted @ 2007-04-24 19:04 啤酒 閱讀(999) | 評論 (0)編輯 收藏

            2002-2004年國內80個一級學科高校排名(4)

                 摘要: 0803  光學工程   學位授予單位名稱 整體水平 分項指標 ...  閱讀全文

            posted @ 2007-04-24 18:42 啤酒 閱讀(381) | 評論 (0)編輯 收藏

            2002-2004年國內80個一級學科高校排名(3)

                 摘要: 0802 機械工程   學位授予單位代碼及名稱 整體水平 分項指標 ...  閱讀全文

            posted @ 2007-04-24 18:39 啤酒 閱讀(565) | 評論 (0)編輯 收藏

            2002-2004年國內80個一級學科高校排名(2)

                 摘要: 0704 天文學   學位授予單位名稱 整體水平 分項指標 ...  閱讀全文

            posted @ 2007-04-24 18:34 啤酒 閱讀(338) | 評論 (0)編輯 收藏

            2002-2004年國內80個一級學科高校排名(1)

                 摘要: 0101 哲學   學位授予單位名稱 整體水平 分項指標 ...  閱讀全文

            posted @ 2007-04-24 18:30 啤酒 閱讀(319) | 評論 (0)編輯 收藏

            2006年國內高校一級學科排名詳析

                 摘要: 一級學科代碼及名稱:0701 數學 排名 學校代碼及名稱 整體水平得分 1 ...  閱讀全文

            posted @ 2007-04-24 18:07 啤酒 閱讀(997) | 評論 (0)編輯 收藏

            關于"985"

            一、什么是“985工程”?

              1998年5月4日,江澤民總書記在慶祝北大建校100周年大會上向全社會宣告:“為了實現現代化,我國要有若干所具有世界先進水平的一流大學。”為貫徹落實黨中央科教興國的戰略和江澤民同志的號召,教育部決定在實施“面向21世紀教育振興行動計劃”中,重點支持北京大學、清華大學等部分高等學校創建世界一流大學和高水平大學,簡稱“985”工程。

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

              一期名單:(34所)
              清華大學
              北京大學
              中國科技大學
              南京大學
              復旦大學
              上海交通大學
              西安交通大學
              浙江大學
              哈爾濱工業大學
              南開大學
              天津大學
              東南大學
              華中科技大學
              武漢大學
              廈門大學
              山東大學
              湖南大學
              中國海洋大學
              中南大學
              吉林大學
              北京理工大學
              大連理工大學
              北京航空航天大學
              重慶大學
              電子科技大學
              四川大學
              華南理工大學
              中山大學
              蘭州大學
              東北大學
              西北工業大學
              同濟大學
              北京師范大學
              中國人民大學

              二期名單:(4所)
              中國農業大學
              國防科技大學
              中央民族大學
              西北農林科技大學

            posted @ 2007-04-24 17:59 啤酒 閱讀(470) | 評論 (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 啤酒 閱讀(6075) | 評論 (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 啤酒 閱讀(817) | 評論 (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 啤酒 閱讀(882) | 評論 (0)編輯 收藏

            僅列出標題  下一頁

            導航

            統計

            常用鏈接

            留言簿(2)

            隨筆檔案

            收藏夾

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久久亚洲AV无码专区首JN| 久久精品天天中文字幕人妻| 四虎国产精品成人免费久久| 亚洲人成无码www久久久| 国产精品美女久久福利网站| 无码国内精品久久人妻蜜桃| 国产精品久久久久久久午夜片| 99久久免费国产精品特黄| 国产韩国精品一区二区三区久久| 久久国产影院| www.久久热.com| 精品久久亚洲中文无码| 99久久精品无码一区二区毛片| 99久久夜色精品国产网站| 国产成人久久777777| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久99国产精品成人欧美| 人妻无码αv中文字幕久久| 天天做夜夜做久久做狠狠| 人人狠狠综合久久亚洲88| 精品久久久噜噜噜久久久| 亚洲国产成人久久一区WWW| 亚洲国产成人久久精品影视 | 精品久久久久中文字幕一区| 三上悠亚久久精品| 欧美精品乱码99久久蜜桃| 久久久精品波多野结衣| 色综合久久综精品| 久久久久夜夜夜精品国产| 久久99精品久久久久久久不卡| 久久久久久久久久久| 人人狠狠综合久久亚洲高清| 国产精品成人99久久久久| 亚洲国产成人久久精品影视| 久久综合九色综合久99| 久久国产精品久久精品国产| 久久66热人妻偷产精品9| 蜜臀av性久久久久蜜臀aⅴ麻豆| 无码精品久久久天天影视| 久久久久人妻精品一区二区三区 | 成人国内精品久久久久影院|