• <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>
            隨筆 - 40, 文章 - 0, 評論 - 9, 引用 - 0
            數(shù)據(jù)加載中……

            C++文件讀寫函數(shù)介紹

            http://www.zxbc.cn/html/cjjhs/1413524521078.html

            今天給大家介紹一下C++中常用到的讀寫函數(shù),新手可以收藏一下,方便以后查找。 
              1.fopen()
              fopen的原型是:FILE *fopen(const char *filename,const char *mode),fopen實(shí)現(xiàn)三個(gè)功能:為使用而打開一個(gè)流,把一個(gè)文件和此流相連接,給此流返回一個(gè)FILR指針。
              參數(shù)filename指向要打開的文件名,mode表示打開狀態(tài)的字符串,其取值如下:
              字符串 含義
              "r" 以只讀方式打開文件
              "w" 以只寫方式打開文件
              "a" 以追加方式打開文件
              "r+" 以讀/寫方式打開文件,如無文件出錯(cuò)
              "w+" 以讀/寫方式打開文件,如無文件生成新文件
            一個(gè)文件可以以文本模式或二進(jìn)制模式打開,這兩種的區(qū)別是:在文本模式中回車被當(dāng)成一個(gè)字符’\n’,而二進(jìn)制模式認(rèn)為它是兩個(gè)字符 0x0D,0x0A;如果在文件中讀到0x1B,文本模式會(huì)認(rèn)為這是文件結(jié)束符,也就是二進(jìn)制模型不會(huì)對文件進(jìn)行處理,而文本方式會(huì)按一定的方式對數(shù)據(jù)作 相應(yīng)的轉(zhuǎn)換。
              系統(tǒng)默認(rèn)的是以文本模式打開,可以修改全部變量_fmode的值來修改這個(gè)設(shè)置,例如_fmode=O_TEXT;就設(shè)置默認(rèn)打開方式為文本模式;而_fmode=O_BINARY;則設(shè)置默認(rèn)打開方式是二進(jìn)制模式。
              我們也可以在模式字符串中指定打開的模式,如"rb"表示以二進(jìn)制模式打開只讀文件,"w+t"或"wt+"表示以文本模式打開讀/寫文件。
              此函數(shù)返回一個(gè)FILE指針,所以申明一個(gè)FILE指針后不用初始化,而是用fopen()來返回一個(gè)指針并與一個(gè)特定的文件相連,如果成敗,返回NULL,中國自學(xué)編程網(wǎng),www.zxbc.cn
              例:
               以下是引用片段:
            FILE *fp; 
              if(fp=fopen("123.456","wb")) 
              puts("打開文件成功"); 
              else 
              puts("打開文件成敗");
              2.fclose()
              fclose()的功能就是關(guān)閉用fopen()打開的文件,其原型是:int fclose(FILE *fp);如果成功,返回0,失敗返回EOF。
              在程序結(jié)束時(shí)一定要記得關(guān)閉打開的文件,不然可能會(huì)造成數(shù)據(jù)丟失的情況,我以前就經(jīng)常犯這樣的錯(cuò)誤。
              例:fclose(fp);
              3.fputc()
              向流寫一個(gè)字符,原型是int fputc(int c, FILE *stream); 成功返回這個(gè)字符,失敗返回EOF。
              例:fputc(’X’,fp);
              4.fgetc()
              從流中讀一個(gè)字符,原型是int fputc(FILE *stream); 成功返回這個(gè)字符,失敗返回EOF。
              例:char ch1=fgetc(fp);
              5. fseek()
            此函數(shù)一般用于二進(jìn)制模式打開的文件中,功能是定位到流中指定的位置,原型是 int fseek(FILE *stream, long offset, int whence);如果成功返回0,參數(shù)offset是移動(dòng)的字符 數(shù),whence是移動(dòng)的基準(zhǔn),取值是:
              符號(hào)常量 值 基準(zhǔn)位置
              SEEK_SET 0 文件開頭
              SEEK_CUR 1 當(dāng)前讀寫的位置
              SEEK_END 2 文件尾部
              例:fseek(fp,1234L,SEEK_CUR);//把讀寫位置從當(dāng)前位置向后移動(dòng)1234字節(jié)(L后綴表示長整數(shù))
              fseek(fp,0L,2);//把讀寫位置移動(dòng)到文件尾
              6.fputs()
              寫一個(gè)字符串到流中,原型int fputs(const char *s, FILE *stream);
                例:fputs("I Love You",fp);
              7.fgets()
              從流中讀一行或指定個(gè)字符,原型是char *fgets(char *s, int n, FILE *stream); 從流中讀取n-1個(gè)字符,除非讀完一行,參數(shù)s是來接收字符串,如果成功則返回s的指針,否則返回NULL。
              例:如果一個(gè)文件的當(dāng)前位置的文本如下:
              Love ,I Have
              But ……..
              如果用
              fgets(str1,4,file1);
              則執(zhí)行后str1="Lov",讀取了4-1=3個(gè)字符,而如果用
              fgets(str1,23,file1);
              則執(zhí)行str="Love ,I Have",讀取了一行(不包括行尾的’\n’)。
              8.fprintf()
              按格式輸入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, …]);其用法和printf()相同,不過不是寫到控制臺(tái),而是寫到流罷了。
              例:fprintf(fp,"%2d%s",4,"Hahaha");
              9.fscanf()
              從流中按格式讀取,其原型是int fscanf(FILE *stream, const char *format[, address, …]);其用法和scanf()相同,不過不是從控制臺(tái)讀取,而是從流讀取罷了。
              例:fscanf(fp,"%d%d" ,&x,&y);
              10.feof()
              檢測是否已到文件尾,是返回真,否則返回0,其原型是int feof(FILE *stream);
              例:if(feof(fp))printf("已到文件尾");
              11.ferror()
              原型是int ferror(FILE *stream);返回流最近的錯(cuò)誤代碼,可用clearerr()來清除它,clearerr()的原型是void clearerr(FILE *stream);
              例:printf("%d",ferror(fp));
              12.rewind()
              把當(dāng)前的讀寫位置回到文件開始,原型是void rewind(FILE *stream);其實(shí)本函數(shù)相當(dāng)于fseek(fp,0L,SEEK_SET);
              例:rewind(fp);
              12.remove()
              刪除文件,原型是int remove(const char *filename); 參數(shù)就是要?jiǎng)h除的文件名,成功返回0。
              例:remove("c:\\io.sys");
              13.fread()
            從流中讀指定個(gè)數(shù)的字符,原型是 size_t fread(void *ptr, size_t size, size_t n, FILE *stream);參數(shù)ptr是保存讀取的 數(shù)據(jù),void*的指針可用任何類型的指針來替換,如char*、int *等等來替換;size是每塊的字節(jié)數(shù);n是讀取的塊數(shù),如果成功,返回實(shí)際讀 取的塊數(shù)(不是字節(jié)數(shù)),本函數(shù)一般用于二進(jìn)制模式打開的文件中。
              例:
               以下是引用片段:
            char x[4230]; 
              FILE *file1=fopen("c:\\msdos.sys","r"); 
              fread(x,200,12 ,file1);//共讀取200*12=2400個(gè)字節(jié)
              14.fwrite()
            與fread對應(yīng),向流中寫指定的數(shù)據(jù),原型是 size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);參數(shù) ptr是要寫入的數(shù)據(jù)指針,void*的指針可用任何類型的指針來替換,如char*、int *等等來替換;size是每塊的字節(jié)數(shù);n是要寫的塊數(shù), 如果成功,返回實(shí)際寫入的塊數(shù)(不是字節(jié)數(shù)),本函數(shù)一般用于二進(jìn)制模式打開的文件中。
                例:
               以下是引用片段:
              char x[]="I Love You"; 
              fwire(x, 6,12,fp);//寫入6*12=72字節(jié) 
              將把"I Love"寫到流fp中12次,共72字節(jié)
              15.tmpfile()
              其原型是FILE *tmpfile(void); 生成一個(gè)臨時(shí)文件,以"w+b"的模式打開,并返回這個(gè)臨時(shí)流的指針,如果失敗返回NULL。在程序結(jié)束時(shí),這個(gè)文件會(huì)被自動(dòng)刪除。
              例:FILE *fp=tmpfile();
              16.tmpnam();
              其原型為char *tmpnam(char *s); 生成一個(gè)唯一的文件名,其實(shí)tmpfile()就調(diào)用了此函數(shù),參數(shù)s用來保存得到的文件名,并返回這個(gè)指針,如果失敗,返回NULL。
              例:tmpnam(str1);

            posted @ 2008-09-12 17:07 茶 閱讀(767) | 評論 (0)編輯 收藏

            C++解析XML(From:C++ front)

            http://blog.csdn.net/wangqis/archive/2006/05/17/743039.aspx
            http://blog.csdn.net/amidiot/archive/2005/09/11/477335.aspx

            用mingw32-make前修改一下makefile文件,改為如下

            # DEBUG can be set to YES to include debugging info, or NO otherwise(不是DEBUG)
            DEBUG          := NO

            # PROFILE can be set to YES to include profiling info, or NO otherwise
            PROFILE        := NO

            # TINYXML_USE_STL can be used to turn on STL support. NO, then STL
            # will not be used. YES will include the STL files.(使用STL,選擇的話,則可以使用std::string)
            TINYXML_USE_STL := YES


            張弛<zhangchi(at)china.com>

            注:本文的最新版本可以在下面的地址找到
                   http://amidiot.512j.com/article/tinyxml/tinyxml_note.htm

            一、      TinyXml的特點(diǎn)

            TinyXml是一個(gè)基于DOM模型的、非驗(yàn)證的輕量級C++解釋器。

            1.      SAXDOM

            目前XML的解析主要有兩大模型:SAXDOM

            其中SAX是基于事件的,其基本工作流程是分析XML文檔,當(dāng)發(fā)現(xiàn)了一個(gè)新的元素時(shí),產(chǎn)生一個(gè)對應(yīng)事件,并調(diào)用相應(yīng)的用戶處理函數(shù)。這種方式占用內(nèi)存少,速度快,但用戶程序相應(yīng)得會(huì)比較復(fù)雜。

            DOM(文檔對象模型),則是在分析時(shí),一次性的將整個(gè)XML文檔進(jìn)行分析,并在內(nèi)存中形成對應(yīng)的樹結(jié)構(gòu),同時(shí),向用戶提供一系列的接口來訪問和編輯該樹結(jié)構(gòu)。這種方式占用內(nèi)存大,速度往往慢于SAX,但可以給用戶提供一個(gè)面向?qū)ο蟮脑L問接口,對用戶更為友好。

            另據(jù)說,一些同時(shí)提供了SAXDOM接口的庫,是在底層先實(shí)現(xiàn)SAX,再在SAX的基礎(chǔ)上實(shí)現(xiàn)DOM

            目前我知道的XML解析庫有下面幾個(gè):

            名稱

            訪問接口

            是否支持驗(yàn)證

            備注

            Expat

            SAX/Local

            不清楚

            Local指它還有一套自己訪問模型

            LibXML2

            SAX/DOM

             

             

             

            TinyXml

            DOM

             

             

             

            XML4C

            SAX/DOM

            Xerces-C是一家,不過用了ICU,國際化似乎更好

            Xerces-C

            SAX/DOM

             

             

             

            XML Booster

            Local

            不清楚

            這個(gè)庫不是特別了解,好像是類似yacc那樣,可以生成一個(gè)特定的解析器,估計(jì)效率應(yīng)該很高(看名字也像)。

             

             

             

            2.      驗(yàn)證和非驗(yàn)證

            對于一個(gè)特定的XML文檔而言,其正確性分為兩個(gè)層次。首先是其格式應(yīng)該符合XML的基本格式要求,比如第一行要有聲明,標(biāo)簽的嵌套層次必須前后一致等等,符合這些要求的文件,就是一個(gè)合格的XML文件,稱作well-formatted。但除此之外,一個(gè)XML文檔因其內(nèi)容的不同還必須在語義上符合相應(yīng)的標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)由相應(yīng)的DTD文件或者Schema文件來定義,符合了這些定義要求的XML文件,稱作valid

            因此,解析器也分為兩種,一種是驗(yàn)證的,即會(huì)跟據(jù)XML文件中的聲明,用相應(yīng)的DTD文件對XML文件進(jìn)行校驗(yàn),檢查它是否滿足DTD文件的要求。另一種是忽略DTD文件,只要基本格式正確,就可以進(jìn)行解析。

            就我所知,驗(yàn)證的解析器通常都是比較重量級的。TinyXml不支持驗(yàn)證,但是體積很小,用在解析格式較為簡單的XML文件,比如配置文件時(shí),特別的合適。

             

            二、      TinyXml的構(gòu)建和使用

            1.      獲取

            TinyXml首頁在http://www.grinninglizard.com/tinyxml/index.html,從這里可以找到最新版本的源代碼,目前的版本是2.3.4

            2.      構(gòu)建

            TinyXml在構(gòu)建時(shí)可以選擇是否支持STL,選擇的話,則可以使用std::string,所以通常應(yīng)該打開這個(gè)選項(xiàng)。

            Windows上,TinyXml的源碼包里提供了VC6的工程文件,直接用它就可以生成兩個(gè)靜態(tài)庫(帶STL和不帶STL),非常容易。唯一需要注意的是,默認(rèn)生成的庫是單線程的,如果用在多線程的項(xiàng)目中,需要改動(dòng)一下配置,生成相應(yīng)的多線程庫。

            Unix平臺(tái)上,TinyXml的源碼包里只提供了一個(gè)Makefile,對于典型的Linux系統(tǒng),或裝了gccgmake的其他Unix,這個(gè)Makefile足夠用了,我在RH9RHEL4上測試,簡單的make就成功了。需要注意的有以下幾點(diǎn):默認(rèn)的編譯是不支持STL的,可以通過編輯MakefileTINYXML_USE_STL := NO那一行,把NO改成YES就可以支持STL了;還有默認(rèn)只生成了一個(gè)測試程序,沒有生成任何庫,如果要生成靜態(tài)庫的話,可以用ar命令,將生成的幾個(gè)目標(biāo)文件打包就行了,如果要生成動(dòng)態(tài)庫,則需要加上-fpic參數(shù)重新編譯。

            3.      使用

            構(gòu)建了相應(yīng)的庫之后,在使用了它們的工程中,只要在連接時(shí)把他們連上就行了。需要注意的是,如果需要STL支持,在編譯用到了TinyXml的文件時(shí),需要定義一個(gè)宏TIXML_USE_STL,對gcc,可以使用參數(shù)-DTIXML_USE_STL,對cl.exeVC),可以使用參數(shù)/DTIXML_USE_STL,如果嫌麻煩,可以直接定義在 tinyxml.h文件里。

             

             

             

            三、      TinyXml的編程模型

            1.      類之間的關(guān)系

            TinyXml實(shí)現(xiàn)的時(shí)DOM訪問模型,因此提供了一系列的類對應(yīng)XML文件中的各個(gè)節(jié)點(diǎn)。主要類間的關(guān)系如下圖所示:

            類結(jié)構(gòu)圖

            TiXmlBase:其他類的基類,是個(gè)抽象類

            TiXmlNode:表示一個(gè)節(jié)點(diǎn),包含節(jié)點(diǎn)的一般方法,如訪問自節(jié)點(diǎn)、兄弟節(jié)點(diǎn)、編輯自身、編輯子節(jié)電

            TiXmlDocument:表示整個(gè)XML文檔,不對應(yīng)其中某個(gè)特定的節(jié)點(diǎn)。

            TiXmlElement:表示元素節(jié)點(diǎn),可以包含子節(jié)點(diǎn)和TiXmlAttribute

            TiXmlComment:表示注釋

            TiXmlDeclaration:表示聲明

            TiXmlText:表示文本節(jié)點(diǎn)

            TiXmlUnknown:表示未知節(jié)點(diǎn),通常是出錯(cuò)了

            TiXmlAttribute:表示一個(gè)元素的屬性

            下面是一個(gè)簡單的例子:

            <?xml version="1.0" encoding="utf-8" ?>
                    <!-This is only a sample-->

                <book>

                    <name>TinyXml How To</name>

                   <price unit=”RMB”>20</price>

                    <description>Some words…</description>

             </ book >

             
                    整個(gè)文檔,對應(yīng)TiXmlDocument

            book,name,price, description,都對應(yīng)TiXmlElement

            第一行對應(yīng)一個(gè)TiXmlDeclaration

            第二行對應(yīng)一個(gè)TiXmlComment

            “TinyXml How To”對應(yīng)一個(gè)TiXmlText

            unit則是price的一個(gè)TiXmlAttribute

            這些類與XML文件中的相應(yīng)元素都有很好的對應(yīng)關(guān)系,因此相信參照TinyXml的文檔,可以很容易的掌握各個(gè)方法的使用。

             

            2.      需要注意的問題

            各類之間的轉(zhuǎn)換

            由于各個(gè)節(jié)點(diǎn)類都從TiXmlNode繼承,在使用時(shí)常常需要將TiXmlNode*類型的指針轉(zhuǎn)換為其派生類的指針,在進(jìn)行這種轉(zhuǎn)換時(shí),應(yīng)該首先使用由TiXmlNode類提供的一系列轉(zhuǎn)換函數(shù),如ToElement(void),而不是c++dynamic_cast

             檢查返回值

             由于TinyXml是一個(gè)非校驗(yàn)的解析器,因此當(dāng)解析一個(gè)文件時(shí),很可能文件并不包含我們預(yù)期的某個(gè)節(jié)點(diǎn),在這種情況下,TinyXml將返回空指針。因此,必須要對返回值進(jìn)行檢查,否則將很容易出現(xiàn)內(nèi)存訪問的錯(cuò)誤。

             如何重頭建立一個(gè)XML文件

             先建立一個(gè)TiXmlDocument對象,然后,載入某個(gè)模板,或者直接插入一個(gè)節(jié)點(diǎn)作為根節(jié)點(diǎn),接著就可以像打開一個(gè)已有的XML文件那樣對它進(jìn)行操作了。

             

            四、      總結(jié)

            TinyXml最大的特點(diǎn)就是它很小,可以很方便的靜態(tài)連接到程序里。對于像配置文件、簡單的數(shù)據(jù)文件這類文件的解析,它很適合。但是由于它是非驗(yàn)證的,因此需要在程序里做許多檢查工做,加重了程序編寫的負(fù)擔(dān)。因此對于復(fù)雜的XML文件,我覺得最好還是用驗(yàn)證的解析器來處理。


            posted @ 2008-09-12 14:12 茶 閱讀(796) | 評論 (0)編輯 收藏

            C++各大有名庫的介紹(作者 armman)

            http://hi.baidu.com/chendeping/blog/item/ff0de518418aecb24bedbc6f.html

            C++各大有名庫的介紹——GUI

              在眾多C++的庫中,GUI部分的庫算是比較繁榮,也比較引人注目的。在實(shí)際開發(fā)中,GUI庫的選擇也是非常重要的一件事情,下面我們綜述一下可選擇的GUI庫,各自的特點(diǎn)以及相關(guān)工具的支持。

            1、MFC

              大名鼎鼎的微軟基礎(chǔ)類庫(Microsoft Foundation Class)。大凡學(xué)過VC++的人都應(yīng)該知道這個(gè)庫。雖然從技術(shù)角度講,MFC是不大漂亮的,但是它構(gòu)建于Windows API 之上,能夠使程序員的工作更容易,編程效率高,減少了大量在建立 Windows 程序時(shí)必須編寫的代碼,同時(shí)它還提供了所有一般 C++ 編程的優(yōu)點(diǎn),例如繼承和封裝。MFC 編寫的程序在各個(gè)版本的Windows操作系統(tǒng)上是可移植的,例如,在Windows 3.1下編寫的代碼可以很容易地移植到 Windows NT 或 Windows 95 上。但是在最近發(fā)展以及官方支持上日漸勢微。

            2、QT

            參考網(wǎng)站:http://www.trolltech.com

              Qt是Trolltech公司的一個(gè)多平臺(tái)的C++圖形用戶界面應(yīng)用程序框架。它提供給應(yīng)用程序開發(fā)者建立藝術(shù)級的圖形用戶界 面所需的所用功能。Qt是完全面向?qū)ο蟮暮苋菀讛U(kuò)展,并且允許真正地組件編程。自從1996年早些時(shí)候,Qt進(jìn)入商業(yè)領(lǐng)域,它已經(jīng)成為全世界范圍內(nèi)數(shù)千種 成功的應(yīng)用程序的基礎(chǔ)。Qt也是流行的Linux桌面環(huán)境KDE 的基礎(chǔ),同時(shí)它還支持Windows、Macintosh、Unix/X11等多種平臺(tái)。

            3、WxWindows

            參考網(wǎng)站:http://www.wxwindows.org

              跨平臺(tái)的GUI庫。因?yàn)槠漕悓哟螛O像MFC,所以有文章介紹從MFC到WxWindows的代碼移植以實(shí)現(xiàn)跨平臺(tái)的功能。通過 多年的開發(fā)也是一個(gè)日趨完善的GUI庫,支持同樣不弱于前面兩個(gè)庫。并且是完全開放源代碼的。新近的C++ Builder X的GUI設(shè)計(jì)器就是基于這個(gè)庫的。

            4、Fox

            參考網(wǎng)站:http://www.fox-toolkit.org/

              開放源代碼的GUI庫。作者從自己親身的開發(fā)經(jīng)驗(yàn)中得出了一個(gè)理想的GUI庫應(yīng)該是什么樣子的感受出發(fā),從而開始了對這個(gè)庫的開發(fā)。有興趣的可以嘗試一下。

            5、WTL

              基于ATL的一個(gè)庫。因?yàn)槭褂昧舜罅緼TL的輕量級手法,模板等技術(shù),在代碼尺寸,以及速度優(yōu)化方面做得非常到位。主要面向的使用群體是開發(fā)COM輕量級供網(wǎng)絡(luò)下載的可視化控件的開發(fā)者。

            6、GTK

            參考網(wǎng)站:http://gtkmm.sourceforge.net/

              GTK是一個(gè)大名鼎鼎的C的開源GUI庫。在Linux世界中有Gnome這樣的殺手應(yīng)用。而Qt就是這個(gè)庫的C++封裝版本。

            C++各大有名庫的介紹——網(wǎng)絡(luò)通信

            1、ACE

            參考網(wǎng)站:http://www.cs.wustl.edu/~schmidt/ACE.html

              C++庫的代表,超重量級的網(wǎng)絡(luò)通信開發(fā)框架。ACE自適配通信環(huán)境(Adaptive Communication Environment)是可以自由使用、開放源代碼的面向?qū)ο罂蚣埽谄渲袑?shí)現(xiàn)了許多用于并發(fā)通信軟件的核心模式。ACE提供了一組豐富的可復(fù)用C++ 包裝外觀(Wrapper Facade)和框架組件,可跨越多種平臺(tái)完成通用的通信軟件任務(wù),其中包括:事件多路分離和事件處理器分派、信號(hào)處理、服務(wù)初始化、進(jìn)程間通信、共享內(nèi) 存管理、消息路由、分布式服務(wù)動(dòng)態(tài)(重)配置、并發(fā)執(zhí)行和同步,等等。

            2、StreamModule

            參考網(wǎng)站:http://www.omnifarious.org/StrMod

              設(shè)計(jì)用于簡化編寫分布式程序的庫。嘗試著使得編寫處理異步行為的程序更容易,而不是用同步的外殼包起異步的本質(zhì)。

            3、SimpleSocket

            參考網(wǎng)站:http://home.hetnet.nl/~lcbokkers/simsock.htm

              這個(gè)類庫讓編寫基于socket的客戶/服務(wù)器程序更加容易。

            4、A Stream Socket API for C++

            參考網(wǎng)站:http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html

              又一個(gè)對Socket的封裝庫。

            C++各大有名庫的介紹——XML

            1、Xerces

            參考網(wǎng)站:http://xml.apache.org/xerces-c/

              Xerces-C++ 是一個(gè)非常健壯的XML解析器,它提供了驗(yàn)證,以及SAX和DOM API。XML驗(yàn)證在文檔類型定義(Document Type Definition,DTD)方面有很好的支持,并且在2001年12月增加了支持W3C XMLSchema 的基本完整的開放標(biāo)準(zhǔn)。

            2、XMLBooster

            參考網(wǎng)站:http://www.xmlbooster.com/

              這個(gè)庫通過產(chǎn)生特制的parser的辦法極大的提高了XML解析的速度,并且能夠產(chǎn)生相應(yīng)的GUI程序來修改這個(gè)parser。在DOM和SAX兩大主流XML解析辦法之外提供了另外一個(gè)可行的解決方案。

            3、Pull Parser

            參考網(wǎng)站:http://www.extreme.indiana.edu/xgws/xsoap/xpp

              這個(gè)庫采用pull方法的parser。在每個(gè)SAX的parser底層都有一個(gè)pull的parser,這個(gè)xpp把這層暴露出來直接給大家使用。在要充分考慮速度的時(shí)候值得嘗試。

            4、Xalan

            參考網(wǎng)站:http://xml.apache.org/xalan-c/

              Xalan是一個(gè)用于把XML文檔轉(zhuǎn)換為HTML,純文本或者其他XML類型文檔的XSLT處理器。

            5、CMarkup

            參考網(wǎng)站:http://www.firstobject.com/xml.htm

              這是一種使用EDOM的XML解析器。在很多思路上面非常靈活實(shí)用。值得大家在DOM和SAX之外尋求一點(diǎn)靈感。

            6、libxml++

            http://libxmlplusplus.sourceforge.net/

              libxml++是對著名的libxml XML解析器的C++封裝版本。

            C++各大有名庫的介紹——科學(xué)計(jì)算

            1、Blitz++

            參考網(wǎng)站:http://www.oonumerics.org/blitz

              Blitz++ 是一個(gè)高效率的數(shù)值計(jì)算函數(shù)庫,它的設(shè)計(jì)目的是希望建立一套既具像C++ 一樣方便,同時(shí)又比Fortran速度更快的數(shù)值計(jì)算環(huán)境。通常,用C++所寫出的數(shù)值程序,比 Fortran慢20%左右,因此Blitz++正是要改掉這個(gè)缺點(diǎn)。方法是利用C++的template技術(shù),程序執(zhí)行甚至可以比Fortran更快。

              Blitz++目前仍在發(fā)展中,對于常見的SVD,F(xiàn)FTs,QMRES等常見的線性代數(shù)方法并不提供,不過使用者可以很容易地利用Blitz++所提供的函數(shù)來構(gòu)建。

            2、POOMA

            參考網(wǎng)站:http://www.codesourcery.com/pooma/pooma

              POOMA是一個(gè)免費(fèi)的高性能的C++庫,用于處理并行式科學(xué)計(jì)算。POOMA的面向?qū)ο笤O(shè)計(jì)方便了快速的程序開發(fā),對并行機(jī)器進(jìn)行了優(yōu)化以達(dá)到最高的效率,方便在工業(yè)和研究環(huán)境中使用。

            3、MTL

            參考網(wǎng)站:http://www.osl.iu.edu/research/mtl

              Matrix Template Library(MTL)是一個(gè)高性能的泛型組件庫,提供了各種格式矩陣的大量線性代數(shù)方面的功能。在某些應(yīng)用使用高性能編譯器的情況下,比如Intel的編譯器,從產(chǎn)生的匯編代碼可以看出其與手寫幾乎沒有兩樣的效能。

            4、CGAL

            參考網(wǎng)站:www.cgal.org

              Computational Geometry Algorithms Library的目的是把在計(jì)算幾何方面的大部分重要的解決方案和方法以C++庫的形式提供給工業(yè)和學(xué)術(shù)界的用戶。

            ================================================================

            作者說:MFC是不大漂亮的。我至今沒有這樣的認(rèn)識(shí)。好像很多人這樣說,我不明白為什么,我覺得MFC是優(yōu)美的,合適的。而且只要 你明白了MFC的模塊狀態(tài)、線程狀態(tài)和模塊線程狀態(tài),明白了OLE,那么MFC就是清晰的。有些說MFC的宏不好,我不認(rèn)為,ATL也像MFC一樣用宏, 而且這些宏雖不利于調(diào)試,卻是利于閱讀的。如果說MFC提供的界面元素不夠新穎,不夠豐富,我沒有任何意見,這也是BCG庫及類似的庫存在的原因。



            posted @ 2008-09-12 13:55 茶 閱讀(793) | 評論 (1)編輯 收藏

            STL vector 容器介紹

                 摘要: http://blog.csdn.net/masterlee/archive/2004/11/09/174129.aspx STL vector 容器介紹 A Presentation of the STL Vector Container (By Nitron) 翻譯 masterlee 介紹std::vector,并且討論它在STL中的算法和條件函數(shù)remove_if()。 &nbs...  閱讀全文

            posted @ 2008-09-04 17:06 茶 閱讀(1384) | 評論 (0)編輯 收藏

            vc的stdafx文件和C1083、C1010錯(cuò)誤(轉(zhuǎn))

            http://blog.csdn.net/gofishing/archive/2006/04/12/660798.aspx

            今天在改一個(gè)舊的vc6工程(為了節(jié)省空間和方便備份,以前收尾時(shí)把中間文件都刪了),整理了一下文件,歸了歸類,結(jié)果不知怎么的,工程不能編譯了,編譯 什么文件都出現(xiàn) fatal error C1083: Cannot open precompiled header file: 'Debug/xxx.pch': No such file or directory, 可是我也沒刪什么文件,改程序內(nèi)容,就是把文件挪了挪,看來是vc的工程有點(diǎn)問題,只好查查怎么回事。

            用vc新建的工程一般都有這兩個(gè)文件(空工程除外),其實(shí)如果不用mfc,這兩個(gè)根本沒用
            StdAfx.cpp 就一句#include "stdafx.h"
            StdAfx.h 包含了一些頭文件,如果沒用mfc就一句有用的#include <stdio.h>
            要 是你把哪個(gè)源文件的#include "stdafx.h"這行刪除了,或者從其他工程考過來一個(gè)文件沒有這行的,編譯時(shí)一律是 fatal error C1010: unexpected end of file while looking for precompiled header directive, 這時(shí)你只要給該文件開頭加個(gè)#include "stdafx.h"就了事。
            這兩個(gè)文件除了這點(diǎn)之外還有一個(gè)問題,就是這兩個(gè)文件不能從工程里刪 除,不然你編譯任何一個(gè).cpp/.c的文件都會(huì)報(bào) fatal error C1083: Cannot open precompiled header file: 'Debug/xxx.pch': No such file or directory, 你build也不行,vc會(huì)給每一個(gè)源文件報(bào)這樣一個(gè)錯(cuò)誤。

            你再把這兩個(gè)文件加入工程,一樣不行,不論你把他們加在哪,怎么編譯就是fatal error C1083,找不到.pch文件。只有新建一個(gè)工程,然后把原來的源文件都加過去,要是工程里有很多源文件,進(jìn)行了很多設(shè)置的話,可就麻煩了。

            于 是,我新建了一個(gè)工程就叫test把,看看怎么會(huì)出現(xiàn)fatal error C1083的。在新建一個(gè)工程后,vc在工程目錄里生成了幾個(gè)文件,包括 test.dsp(工程文件)、StdAfx.h、StdAfx.cpp。和主程序源文件test.cpp等。如果你build工程,會(huì)在相應(yīng)的編譯目錄 下(一般為debug或release)產(chǎn)生test.pch、vc60.idb、vc60.pdb、StdAfx.obj和源程序的obj、pdb文件 和一個(gè)test.exe程序,fatal error C1083就是說沒有這個(gè).pch文件,他也不能產(chǎn)生這個(gè)文件。那到底vc是怎么產(chǎn)生這個(gè)文件的, 又是作了什么改動(dòng)使他不能再產(chǎn)生這個(gè)文件的呢?我們將debug目錄刪除,然后編譯test.cpp文件,結(jié)果j:\test \test.cpp(4) : fatal error C1083: Cannot open precompiled header file: 'Debug/test.pch': No such file or directory; 不行,我build:
            --------------------Configuration: test - Win32 Debug--------------------
            Compiling...
            StdAfx.cpp
            Compiling...
            test.cpp
            Linking...
            test.exe - 0 error(s), 0 warning(s)

            看 來是編譯StdAfx.cpp產(chǎn)生了test.pch,然后再編譯test.cpp的把;再把debug目錄刪了,編譯StdAfx.cpp就ok,看看 debug目錄:test.pch、StdAfx.obj、vc60.idb、vc60.pdb。原來是編譯StdAfx.cpp產(chǎn)生的pch文件,那從 工程里刪除這個(gè)文件然后在添加這個(gè)文件為什么不行呢?肯定是在在刪除/添加StdAfx.cpp文件過程中,工程文件不一樣了。先關(guān)閉工程,把 test.dsp備份,然后打開工程,刪除StdAfx.cpp文件,在添加,編譯,錯(cuò)誤C1083,然后關(guān)閉工程(保存工程)。fc比較一下剛才備份的 dsp和現(xiàn)在的工程文件,發(fā)現(xiàn)原來正常的那個(gè)工程文件里在SOURCE=.\StdAfx.cpp之后多這么一 行# ADD CPP /Yc"stdafx.h",而刪了StdAfx.cpp再添加的工程就沒有,其他的就完全一樣。

            正常的dsp文件包含StdAfx.cpp的這兩行是這樣的:
            SOURCE=.\StdAfx.cpp
            # ADD CPP /Yc"stdafx.h"
            # End Source File

            后記:
            vc 真是奇怪呀,這行# ADD CPP /Yc"stdafx.h"在新建工程時(shí)有,從工程里刪除了StdAfx.cpp就沒有了,再在工程里加上這個(gè) StdAfx.cpp就沒有加上。看似刪除再添加好像沒有動(dòng)工程,誰知道他來這么一手,艾,要是懂編譯懂vc的還好,要是遇上我這樣的菜鳥,艾,只有和他 奮斗半天才把他搞得稀里糊涂。把他寫出來,免得和我一樣的菜鳥再費(fèi)半天勁。

            其實(shí)這個(gè)pch文件是預(yù)編譯頭 (PreCompiled Header),下邊是msdn里關(guān)于PreCompiled Header和/Yc選項(xiàng)的解釋。一直都是用集成編譯環(huán)境的, 先是tc,然后是vc,沒用過make,沒寫過makefile,對編譯、連接這些東西還不是很懂,高手見笑了。這個(gè)選項(xiàng)是可以在工程的設(shè)置里設(shè)的,具體 可以看下邊的msdn幫助。

            /Yc  (Create Precompiled Header File)
            Home | Overview | How Do I | Compiler Options
            This option instructs the compiler to create a precompiled header (.PCH) file that represents the state of compilation at a certain point. (To find this option in the development environment, click Settings on the Project menu. Then click the C/C++ tab, and click Precompiled Headers in the Category box.) 
            Command Line Project Settings Description 
            /Yc Create Precompiled Header File The compiler compiles all code up to the end of the base source file, or to the point in the base file where #pragma hdrstop occurs.
            /Ycfilename Through Header The compiler compiles all code up to and including the .H file specified in the Through Header text box (filename).

            The precompiled code is saved in a file with a name created from the base name of the file specified with the /Yc option and a .PCH extension. You can also use the /Fp option to specify a name for the precompiled header file.
            If you use /Ycfilename (Through Header), the compiler compiles all code up to and including the specified file for subsequent use with the /Yu option. 
            Note  If the options /Ycfilename and /Yufilename occur on the same command line and both reference, or imply, the same file name, /Ycfilename, takes precedence. This feature simplifies the writing of makefiles.
            Example
            Consider the following code:
            #include <afxwin.h>  // Include header for class library
            #include "resource.h" // Include resource definitions
            #include "myapp.h"  // Include information specific to this app
            ...
            When this code is compiled with the command
            CL /YcMYAPP.H PROG.CPP
            the compiler saves all the preprocessing for AFXWIN.H, RESOURCE.H, and MYAPP.H in a precompiled header file called MYAPP.PCH.
            See Also  Creating Precompiled Header Files

            posted @ 2008-09-04 14:17 茶 閱讀(1337) | 評論 (0)編輯 收藏

            同步通信方式與異步通信方式有什么區(qū)別

            最近在看通信的接口規(guī)范,對同步通信和異步通信概念不了解。這里收集點(diǎn)相關(guān)資料。以后如果用到也會(huì)逐步填加。有什么不對的地方也請各位幫忙指點(diǎn)下。

            同步通信方式與異步通信方式有什么區(qū)別

            資料一:
            在串行通信中,由于是一位一位地進(jìn)行數(shù)據(jù)傳送。為了把每個(gè)字節(jié)區(qū)別開來,需
            要收發(fā)雙方在傳送數(shù)據(jù)的串行信息流中,加入一些標(biāo)記信號(hào)位。根據(jù)所添加的標(biāo)記信號(hào)
            位的不同方式,分成同步通信和異步通信兩種。

                異步通信在添加標(biāo)記信號(hào)位時(shí),把所傳送的數(shù)據(jù)以字節(jié)為單位。每個(gè)字節(jié)前加上
            一位起始位,每個(gè)字節(jié)的后面加上停止位,停止位可以是1位、1.5位或2位。有時(shí),還
            要加上一位奇偶檢驗(yàn)位。

                1(起始位)+2(停止位)+1(奇偶校驗(yàn)位)Κ4位標(biāo)記信號(hào)位。這樣,異步通
            信方式的效率就比較低。

                同步通信是把所傳送的數(shù)據(jù)以多個(gè)字節(jié)(100字節(jié)以上)為單位,在其前后添加
            標(biāo)志。

            資料二:
            異步通信”是一種很常用的通信方式。異步通信在發(fā)送字符時(shí),所發(fā)送的字符之間的時(shí)間間隔可以是任意的。當(dāng)然,接收端必須時(shí)刻做好接收的準(zhǔn)備(如果接收端主 機(jī)的電源都沒有加上,那么發(fā)送端發(fā)送字符就沒有意義,因?yàn)榻邮斩烁緹o法接收)。發(fā)送端可以在任意時(shí)刻開始發(fā)送字符,因此必須在每一個(gè)字符的開始和結(jié)束的 地方加上標(biāo)志,即加上開始位和停止位,以便使接收端能夠正確地將每一個(gè)字符接收下來。異步通信的好處是通信設(shè)備簡單、便宜,但傳輸效率較低(因?yàn)殚_始位和 停止位的開銷所占比例較大)。
            異步通信也可以是以幀作為發(fā)送的單位。接收端必須隨時(shí)做好接收幀的準(zhǔn)備。這是,幀的首部必須設(shè)有一些特殊的比特組合,使得接收端能夠找出一幀 的開始。這也稱為幀定界。幀定界還包含確定幀的結(jié)束位置。這有兩種方法。一種是在幀的尾部設(shè)有某種特殊的比特組合來標(biāo)志幀的結(jié)束。或者在幀首部中設(shè)有幀長 度的字段。需要注意的是,在異步發(fā)送幀時(shí),并不是說發(fā)送端對幀中的每一個(gè)字符都必須加上開始位和停止位后再發(fā)送出去,而是說,發(fā)送端可以在任意時(shí)間發(fā)送一 個(gè)幀,而幀與幀之間的時(shí)間間隔也可以是任意的。在一幀中的所有比特是連續(xù)發(fā)送的。發(fā)送端不需要在發(fā)送一幀之前和接收端進(jìn)行協(xié)調(diào)(不需要先進(jìn)行比特同步)。 每個(gè)字符開始發(fā)送的時(shí)間可以是任意的t0 0 1 1 0 1 1 0起始位結(jié)束位t每個(gè)幀開始發(fā)送的時(shí)間可以是任意的以字符為單位發(fā)送以幀為單位發(fā)送幀開始幀結(jié)束
            “同步通信”的通信雙方必須先建立同步,即雙方的時(shí)鐘要調(diào)整到同一個(gè)頻率。收發(fā)雙方不停地發(fā)送和接收連續(xù)的同步比特流。但這時(shí)還有兩種不同的 同步方式。一種是使用全網(wǎng)同步,用一個(gè)非常精確的主時(shí)鐘對全網(wǎng)所有結(jié)點(diǎn)上的時(shí)鐘進(jìn)行同步。另一種是使用準(zhǔn)同步,各結(jié)點(diǎn)的時(shí)鐘之間允許有微小的誤差,然后采 用其他措施實(shí)現(xiàn)同步傳輸。

            posted @ 2008-08-21 10:26 茶 閱讀(2069) | 評論 (0)編輯 收藏

            學(xué)習(xí)linux/unix編程方法的建議(轉(zhuǎn))

            首先先學(xué)學(xué)編輯器,vim, emacs什么的都行。
            然后學(xué)make file文件,只要知道一點(diǎn)就行,這樣就可以準(zhǔn)備編程序了。

              然后看看《C程序設(shè)計(jì)語言》K&R,這樣呢,基本上就可以進(jìn)行一般的編程了,順便找本數(shù)據(jù)結(jié)構(gòu)的書來看。

              如果想學(xué)習(xí)UNIX/LINUX的編程,《APUE》絕對經(jīng)典的教材,加深一下功底,學(xué)習(xí)《UNP》的第二卷。這樣基本上系統(tǒng)方面的就可以掌握了。

              然后再看Douglus E. Comer的《用TCP/IP進(jìn)行網(wǎng)際互連》第一卷,學(xué)習(xí)一下網(wǎng)絡(luò)的知識(shí),再看《UNP》的第一卷,不僅學(xué)習(xí)網(wǎng)絡(luò)編程,而且對系統(tǒng)編程的一些常用的技巧就很熟悉了,如果繼續(xù)網(wǎng)絡(luò)編程,建議看《TCP/IP進(jìn)行網(wǎng)際互連》的第三卷,里面有很多關(guān)于應(yīng)用協(xié)議telnet、ftp等協(xié)議的編程。
            如果想寫設(shè)備驅(qū)動(dòng)程序,首先您的系統(tǒng)編程的接口比如文件、IPC等必須要熟知了,再學(xué)習(xí)《LDD》2。

              對于幾本經(jīng)典教材的評價(jià):

              《The C Programing Language》K&R 經(jīng)典的C語言程序設(shè)計(jì)教材,作者是C語言的發(fā)明者,教材內(nèi)容****。雖然有點(diǎn)老,但是必備的一本手冊,現(xiàn)在有時(shí)候我還常翻翻。篇幅比較小,但是每看一遍,就有一遍的收獲。另外也可用譚浩強(qiáng)的《C語言程序設(shè)計(jì)》代替。

              《Advanced Programing in Unix Envirement》 W.Richard Stevens:也是非常經(jīng)典的書(廢話,Stevens的書哪有不經(jīng)典的!),雖然初學(xué)者就可以看,但是事實(shí)上它是《Unix Network Programing》的一本輔助資料。國內(nèi)的翻譯的《UNIX環(huán)境高級編程》的水平不怎么樣,現(xiàn)在有影印版,直接讀英文比讀中文來得容易。

              《Unix Network Programing》W.Richard Stevens:第一卷講BSD Socket網(wǎng)絡(luò)編程接口和另外一種網(wǎng)絡(luò)編程接口的,不過現(xiàn)在一般都用BSD Socket,所以這本書只要看大約一半多就可以了。第二卷沒有設(shè)計(jì)到網(wǎng)絡(luò)的東西,主要講進(jìn)程間通訊和Posix線程。所以看了《APUE》以后,就可以看它了,基本上系統(tǒng)的東西就由《APUE》和《UNP》vol2概括了。看過《UNP》以后,您就會(huì)知道系統(tǒng)編程的絕大部分編程技巧,即使卷一是講網(wǎng)絡(luò)編程的。國內(nèi)是清華翻譯得《Unix網(wǎng)絡(luò)編程》,翻譯者得功底也比較高,翻譯地比較好。所以建議還是看中文版。

              《TCP/IP祥解》一共三卷,卷一講協(xié)議,卷二講實(shí)現(xiàn),卷三講編程應(yīng)用。我沒有怎么看過。,但是據(jù)說也很經(jīng)典的,因?yàn)槲覜]有時(shí)間看卷二,所以不便評價(jià)。

              《用TCP/IP進(jìn)行網(wǎng)際互連》Douglus.E.Comer 一共三卷,卷一講原理,卷二講實(shí)現(xiàn),卷三講高級協(xié)議。感覺上這一套要比Stevens的那一套要好,就連Stevens也不得不承認(rèn)它的第一卷非常經(jīng)典。事實(shí)上,第一卷即使你沒有一點(diǎn)網(wǎng)絡(luò)的知識(shí),看完以后也會(huì)對網(wǎng)絡(luò)的來龍去脈了如指掌。第一卷中還有很多習(xí)題也設(shè)計(jì)得經(jīng)典和實(shí)用,因?yàn)樽髡弑旧砭褪且晃唤處煟⑶揖硪皇菄庋芯可慕滩摹A?xí)題并沒有答案,留給讀者思考,因?yàn)閱栴}得答案可以讓你成為一個(gè)中級的Hacker,這些問題的答案可以象Douglus索取,不過只有他只給教師卷二我沒有怎么看,卷三可以作為參考手冊,其中地例子也很經(jīng)典。如果您看過Qterm的源代碼,就會(huì)知道Qterm的telnet 實(shí)現(xiàn)部分大多數(shù)就是從這本書的源代碼過來的。對于網(wǎng)絡(luò)原理的書,我推薦它,而不是Stevens的《TCP/IP祥解》。

              《Operating System - Design and Implement》這個(gè)是講操作系統(tǒng)的書,用Minix做的例子。作者母語不是英文,所以英文看起來比較晦澀。國內(nèi)翻譯的是《操作系統(tǒng) 設(shè)計(jì)與實(shí)現(xiàn)》,我沒看過中文版,因?yàn)榉g者是尤晉元,他翻譯的《APUE》已經(jīng)讓我失望頭頂了。讀了這本書,對操作系統(tǒng)的底層怎么工作的就會(huì)
            有一個(gè)清晰的認(rèn)識(shí)。

              《Linux Device Driver》2e ,為數(shù)不多的關(guān)于Linux設(shè)備驅(qū)動(dòng)程序的好書。不過內(nèi)容有些雜亂,如果您沒有一些寫驅(qū)動(dòng)的經(jīng)驗(yàn),初次看會(huì)有些摸不著南北。國內(nèi)翻譯的是《Linux設(shè)備驅(qū)動(dòng)程序》第二版,第一版,第二版的譯者我都有很深的接觸,不過總體上來說,雖然第二版翻譯的有些不盡人意,但是相比第一版來說已經(jīng)超出了一大截。要讀這一本書,至少應(yīng)該先找一些《計(jì)算機(jī)原理》《計(jì)算機(jī)體系結(jié)構(gòu)》的書來馬馬虎虎讀讀,至少應(yīng)該對硬件和計(jì)算機(jī)的工作過程有一些了解。

            posted @ 2008-08-05 00:04 茶 閱讀(282) | 評論 (0)編輯 收藏

            教你怎樣做項(xiàng)目開發(fā)總結(jié)報(bào)告

            I 引言
            1.1編寫目的
              說明編寫這份項(xiàng)目開發(fā)總結(jié)報(bào)告的目的,指出預(yù)期的閱讀范圍。
            1.2背景
              說明:
              a.本項(xiàng)目的名稱和所開發(fā)出來的軟件系統(tǒng)的名稱;
              b.此軟件的任務(wù)提出者、開發(fā)者、用戶及安裝此軟件的計(jì)算中心。
            I.3定義
              列出本文件中用到的專門術(shù)語的定義和外文首字母組詞的原詞組。
            1.4參考資料
              列出要用到的參考資料,如:
              a.本項(xiàng)目的已核準(zhǔn)的計(jì)劃任務(wù)書或合同、上級機(jī)關(guān)的批文;
              b.屬于本項(xiàng)目的其他已發(fā)表的文件;
              c.本文件中各處所引用的文件、資料,包括所要用到的軟件開發(fā)標(biāo)準(zhǔn)。 列出這些文件的標(biāo)題、文

            件編號(hào)、發(fā)表日期和出版單位,說明能夠得到這些文件資料的來源。
            2 實(shí)際開發(fā)結(jié)果
            2.1產(chǎn)品
              說明最終制成的產(chǎn)品,包括:
              a.程序系統(tǒng)中各個(gè)程序的名字,它們之間的層次關(guān)系,以千字節(jié)為單位的各個(gè)程序的程序量、存儲(chǔ)

            媒體的形式和數(shù)量;
              b.程序系統(tǒng)共有哪幾個(gè)版本,各自的版本號(hào)及它們之間的區(qū)別;
              c.每個(gè)文件的名稱;
              d.所建立的每個(gè)數(shù)據(jù)庫。 如果開發(fā)中制訂過配置管理計(jì)劃,要同這個(gè)計(jì)劃相比較。
            2.2主要功能和性能
              逐項(xiàng)列出本軟件產(chǎn)品所實(shí)際具有的主要功能和性能,對照可行性研究報(bào)告、項(xiàng)目開發(fā)計(jì)劃、功能需

            .求說明書的有關(guān)內(nèi)容,說明原定的開發(fā)目標(biāo)是達(dá)到了、未完全達(dá)到、或超過了。
            2.3基本流程
              用圖給出本程序系統(tǒng)的實(shí)際的基本的處理流程。
            2.4進(jìn)度
              列出原定計(jì)劃進(jìn)度與實(shí)際進(jìn)度的對比,明確說明,實(shí)際進(jìn)度是提前了、還是延遲了,分析主要原因


            2.5費(fèi)用
              列出原定計(jì)劃費(fèi)用與實(shí)際支出費(fèi)用的對比,包括:
              a.工時(shí),以人月為單位,并按不同級別統(tǒng)計(jì);
              b.計(jì)算機(jī)的使用時(shí)間,區(qū)別CPU時(shí)間及其他設(shè)備時(shí)間;
              c.物料消耗、出差費(fèi)等其他支出。
              明確說明,經(jīng)費(fèi)是超出了、還是節(jié)余了,分析其主要原因。
            3 開發(fā)工作評價(jià)
            3.1對生產(chǎn)效率的評價(jià)
              給出實(shí)際生產(chǎn)效率,包括:
              a.程序的平均生產(chǎn)效率,即每人月生產(chǎn)的行數(shù);
              b.文件的平均生產(chǎn)效率,即每人月生產(chǎn)的千字?jǐn)?shù);
              并列出原訂計(jì)劃數(shù)作為對比。
            3.2對產(chǎn)品質(zhì)量的評價(jià)
              說明在測試中檢查出來的程序編制中的錯(cuò)誤發(fā)生率,即每干條指令(或語句)中的錯(cuò)誤指令數(shù)(或

            語句數(shù))。如果開發(fā)中制訂過質(zhì)量保證計(jì)劃或配置管理計(jì)劃,要同這些計(jì)劃相比較。
            3.3對技術(shù)方法的評價(jià)
              給出對在開發(fā)中所使用的技術(shù)、方法、工具、手段的評價(jià)。
            3.4出錯(cuò)原因的分析
              給出對于開發(fā)中出現(xiàn)的錯(cuò)誤的原因分析。
            4 經(jīng)驗(yàn)與教訓(xùn)
              列出從這項(xiàng)開發(fā)工作中所得到的最主要的經(jīng)驗(yàn)與教訓(xùn)及對今后的項(xiàng)目開發(fā)工作的建議。

            posted @ 2008-07-02 00:26 茶 閱讀(554) | 評論 (0)編輯 收藏

            進(jìn)程間通訊的方法

            進(jìn)程通常被定義為一個(gè)正在運(yùn)行的程序的實(shí)例,它由兩個(gè)部分組成:
                   一個(gè)是操作系統(tǒng)用來管理進(jìn)程的內(nèi)核對象。內(nèi)核對象也是系統(tǒng)用來存放關(guān)于進(jìn)程的統(tǒng)計(jì)信息的地方
                  另一個(gè)是地址空間,它包含所有的可執(zhí)行模塊或DLL模塊的代碼和數(shù)據(jù)。它還包含動(dòng)態(tài)分配的空間。如線程堆棧和堆分配空間。每個(gè)進(jìn)程被賦予它自己的虛擬地址空間,當(dāng)進(jìn)程中的一個(gè)線程正在運(yùn)行時(shí),該線程可以訪問只屬于它的進(jìn)程的內(nèi)存。屬于其它進(jìn)程的內(nèi)存則是隱藏的,并不能被正在運(yùn)行的線程訪問。
               為了能在兩個(gè)進(jìn)程之間進(jìn)行通訊,由以下幾種方法可供參考:

            0。剪貼板Clipboard: 在16位時(shí)代常使用的方式,CWnd中提供支持

            1。窗口消息 標(biāo)準(zhǔn)的Windows消息以及專用的WM_COPYDATA消息 SENDMESSAGE()接收端必須有一個(gè)窗口

            2。使用共享內(nèi)存方式(Shared Memory)
               a.設(shè)定一塊共享內(nèi)存區(qū)域          
                 HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD,  LPCSTR)
                 產(chǎn)生一個(gè)file-mapping核心對象
                 LPVOID MapViewOfFile(
                     HANDLE hFileMappingObject,
                     DWORD  dwDesiredAcess,
                     DWORD  dwFileOffsetHigh,
                     DWORD  dwFileOffsetLow,
                     DWORD  dwNumberOfBytesToMap
                 );
                得到共享內(nèi)存的指針
               b.找出共享內(nèi)存
                決定這塊內(nèi)存要以點(diǎn)對點(diǎn)(peer to peer)的形式呈現(xiàn)
                    每個(gè)進(jìn)程都必須有相同的能力,產(chǎn)生共享內(nèi)存并將它初始化。每個(gè)進(jìn)程
                    都應(yīng)該調(diào)用CreateFileMapping(),然后調(diào)用GetLastError().如果傳回的
                    錯(cuò)誤代碼是ERROR_ALREADY_EXISTS,那么進(jìn)程就可以假設(shè)這一共享內(nèi)存區(qū)         域已經(jīng)被別的進(jìn)程打開并初始化了,否則該進(jìn)程就可以合理的認(rèn)為自己 排在第          一位,并接下來將共享內(nèi)存初始化。
                還是要使用client/server架構(gòu)中
                   只有server進(jìn)程才應(yīng)該產(chǎn)生并初始化共享內(nèi)存。所有的進(jìn)程都應(yīng)該使用

            HANDLE OpenFileMapping(DWORD dwDesiredAccess,
                                               BOOL bInheritHandle,
                                               LPCTSTR lpName);
                    再調(diào)用MapViewOfFile(),取得共享內(nèi)存的指針
               c.同步處理(Mutex)
               d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
                                    CloseHandle()

            3。動(dòng)態(tài)數(shù)據(jù)交換(DDE)通過維護(hù)全局分配內(nèi)存使的應(yīng)用程序間傳遞成為可能
               其方式是再一塊全局內(nèi)存中手工放置大量的數(shù)據(jù),然后使用窗口消息傳遞內(nèi)存    指針.這是16位WIN時(shí)代使用的方式,因?yàn)樵赪IN32下已經(jīng)沒有全局和局部內(nèi)存    了,現(xiàn)在的內(nèi)存只有一種就是虛存。  

            4。消息管道(Message Pipe)
               用于設(shè)置應(yīng)用程序間的一條永久通訊通道,通過該通道可以象自己的應(yīng)用程序
               訪問一個(gè)平面文件一樣讀寫數(shù)據(jù)。
               匿名管道(Anonymous Pipes)
                   單向流動(dòng),并且只能夠在同一電腦上的各個(gè)進(jìn)程之間流動(dòng)。
               命名管道(Named Pipes)
                   雙向,跨網(wǎng)絡(luò),任何進(jìn)程都可以輕易的抓住,放進(jìn)管道的數(shù)據(jù)有固定的格        式,而使用ReadFile()只能讀取該大小的倍數(shù)。
                   可以被使用于I/O Completion Ports

            5   郵件槽(Mailslots)
                廣播式通信,在32系統(tǒng)中提供的新方法,可以在不同主機(jī)間交換數(shù)據(jù),在        WIN9X下只支持郵件槽客戶

            6。Windows套接字(Windows Socket)
               它具備消息管道所有的功能,但遵守一套通信標(biāo)準(zhǔn)使的不同操作系統(tǒng)之上的應(yīng)    用程序之間可以互相通信。

            7。Internet通信 它讓應(yīng)用程序從Internet地址上載或下載文件

            8。RPC:遠(yuǎn)程過程調(diào)用,很少使用,因其與UNIX的RPC不兼容。

            9。串行/并行通信(Serial/Parallel Communication)
               它允許應(yīng)用程序通過串行或并行端口與其他的應(yīng)用程序通信

            10。COM/DCOM
                 通過COM系統(tǒng)的代理存根方式進(jìn)行進(jìn)程間數(shù)據(jù)交換,但只能夠表現(xiàn)在對接口     函數(shù)的調(diào)用時(shí)傳送數(shù)據(jù),通過DCOM可以在不同主機(jī)間傳送數(shù)據(jù)。

            posted @ 2008-07-02 00:21 茶 閱讀(360) | 評論 (0)編輯 收藏

            C/C++預(yù)處理過程與語句總結(jié)

            轉(zhuǎn)載請保留: http://www.cnscn.org(CNS電腦與英語學(xué)習(xí)網(wǎng))
            Author: cnscn <http://www.cnscn.org>

            1)預(yù)處理

              根據(jù)已放置在文件中的預(yù)處理指令來修改源文件的 內(nèi)容
              預(yù)處理器會(huì)分析\執(zhí)行所有的預(yù)處理器指令,然后刪除他們,得到一個(gè)僅包含C++語句的轉(zhuǎn)換單元
              預(yù)處理指令以#號(hào)開頭


              常用的預(yù)處理指令:
              #include       包含頭文件

              #if               條件
              #else          否則
              #elif            否則如果
              #endif         結(jié)束條件

              #ifdef  或 #if defined        如果定義了一個(gè)符號(hào), 就執(zhí)行操作
              #ifndef 或 #if !defined      如果沒有定義一個(gè)符號(hào), 就指執(zhí)行操作

              #define        定義一個(gè)符號(hào)
              #undef         刪除一個(gè)符號(hào)

              #line            重新定義當(dāng)前行號(hào)和文件名

              #error            輸出編譯錯(cuò)誤 消息, 停止編譯

              #pragma        提供 機(jī)器專用的特性,同時(shí)保證與C++的完全兼容


            2)#include  在 程序中包含頭文件
             頭文件通常以.h結(jié)尾,其 內(nèi)容可使用#include預(yù)處理器指令包含到 程序
             頭文件中一般包含: 函數(shù)原型與全局變量

              形式常有下面兩種
              #include <iostream>
              #include "myheader.h"

              前者<>用來引用標(biāo)準(zhǔn)庫頭文件,后者""常用來引用自定義的頭文件
              前者<>編譯器只搜索包含標(biāo)準(zhǔn)庫頭文件的默認(rèn) 目錄,后者首先搜索正在編譯的源文件所在的 目錄,找不到時(shí)再搜索包含標(biāo)準(zhǔn)庫頭文件的默認(rèn) 目錄.
              如果把頭文件放在其他 目錄下,為了查找到它,必須在雙引號(hào)中指定從源文件到頭文件的完整路徑


            3)#define  定義符號(hào)、宏
            1>符號(hào)
              #define PI 3.1415925  定義符號(hào)PI為3.1415925
              #define PI      取消PI的值

              這里PI看起來像一個(gè)變量,但它與變量沒有任何關(guān)系,它只是一個(gè)符號(hào)或標(biāo)志,在 程序代碼編譯前,此符號(hào)會(huì)用一組指定的字符來代替
              3.14159265 不是一個(gè)數(shù)值,只是一個(gè)字符串,不會(huì)進(jìn)行檢查

              在編譯前,預(yù)處理器會(huì)遍歷代碼,在它認(rèn)為置換有意義的地方,用字符串PI的定義值(3.14159265)來代替
             在注釋或字符串中的PI不進(jìn)行替換

              在C中常以#define來定義符號(hào)常量,但在C++中最好使用const 來定義常量
              #define PI 3.14159265
              const long double PI=3.14159265;
              兩者比較下,前者沒有類型的指定容易引起不必須的麻煩,而后者定義清楚,所以在C++中推薦使用const來定義常量

             #define的缺點(diǎn):
               1)不支持類型檢查
               2)不考慮作用域
               3)符號(hào)名不能限制在一個(gè)命名 空間



            2>#undef 刪除#define定義的符號(hào)
              #define PI 3.14159265
              ... //之間所有的PI都可以被替換為3.14159265

              #undef PI
              之后不再有PI這個(gè)標(biāo)識(shí)符


            3>定義宏
              #define Print(Var) count<<(Var)<<endl
              用宏名中的參數(shù)帶入語句中的參數(shù)
              宏后面沒有;號(hào)
              Print(Var)中的Print和(之間不能有空格,否則(就會(huì)被解釋為置換字符串的一部分

              #define Print(Var, digits)  count << setw(digits) << (Var) << endl
              調(diào)用
              Print(ival, 15)
              預(yù)處理器就會(huì)把它換成
              cout << setw(15) << (ival) << endl;


              所有的情況下都可以使用內(nèi)聯(lián)函數(shù)來代替宏,這樣可以增強(qiáng)類型的檢查
              template<class T> inline void Print (const T& var, const int& digits)
              {
                  count<<setw(digits)<<var<<endl;
              }

              調(diào)用
              Print(ival, 15);


              使用宏時(shí)應(yīng)注意的易引起的錯(cuò)誤:
              #define max(x,y) x>y?x:y;+


              調(diào)用 result = max(myval, 99);  則換成 result = myval>99?myval:99;  這個(gè)沒有問題是正確的
              調(diào)用 result = max(myval++, 99);  則換成 result = myval++>99?myval++:99; 這樣如果myval>99那么myval就會(huì)遞增兩次,這種情況下()是沒什么用的如result=max((x),y)則 result = (myval++)>99?(myval++):99;

              再如
              #define product(m,n) m*n

              調(diào)用
              result = product(5+1,6);則替換為result = 5+1*6; 所以產(chǎn)生了錯(cuò)誤的結(jié)果,此時(shí)應(yīng)使用()把參數(shù)括起
              #define product(m,n) (m)*(n)
              則result = product(5+1,6);則替換為result = (5+1)*(6); 所以產(chǎn)生了錯(cuò)誤的結(jié)果,此時(shí)應(yīng)使用()把參數(shù)括起


            結(jié)論: 一般用內(nèi)聯(lián)函數(shù)來代替預(yù)處理器宏


            技巧:
                1)給替換變量加引號(hào)
                #define MYSTR "I love you"

                cout << MYSTR ; //I love you而不是"I love you"
                如果
                cout << "MYSTR" ; //則會(huì)輸出"MYSTR"而不是"I love you"

                可以這樣做
                cout << #MYSTR ;  //則會(huì)輸出 "I love you"即cout << "\"I love you\"";

                2)在宏表達(dá)式中連接幾個(gè)參數(shù)
                如
                  #define join(a,b) ab 這樣不會(huì)理解為參數(shù)a的值與參數(shù)b的值的連接,即如join(10,999)不會(huì)理解為10999而是把a(bǔ)b理解為字符串,即輸出ab
                這時(shí)可以
                #define join(a,b) a##b
                  則join(10,999)就會(huì)輸出10999


            3)邏輯預(yù)處理器指令
             #if defined CALCAVERAGE 或 #ifdef CALCAVERAGE
               int count=sizeof(data)/sizeof(data[0]);
               for(int i=0; i<count; i++)
                 average += data;
               average /= count;
              #endif

              如果已經(jīng)定義符號(hào)CALCAVERAGE則把#if與#endif間的語句放在要編譯的源代碼內(nèi)


              防止重復(fù)引入某些頭文件
              #ifndef COMPARE_H
              #define COMPARE_H     注意: 這里只是定義一個(gè)沒有值的符號(hào)COMPARE_H, 下面的namespace compare不是COMPARE_H的 內(nèi)容,這里的定義不像是定義一個(gè)常量或宏,僅僅定義一個(gè)符號(hào),指出此符號(hào)已定義,則就會(huì)有下面的 內(nèi)容namespace compare{...
               namespace compare{
                 double max(const double* data, int size);
                 double min(const double* data, int size);
               }
              #endif

              比較
              #define VERSION \
               3
              因?yàn)橛袚Q行符\ 所以上句等價(jià)于 #define VERSION 3
              由此可以看出#define COMPARE_H與namespace compare是獨(dú)立沒有關(guān)系的兩個(gè)行


              也可以這樣用
              #if defined block1 && defined block2
              ...
              #endif

              #if CPU==PENTIUM4
                ...
              #endif


              #if LANGUAGE == ENGLISH
              #define Greeting "Good Morning."
              #elif LANGUAGE == GERMAN
              #define Greeting "Guten Tag."
              #elif LANGUAGE == FRENCH
              #define Greeting "Bonjour."
              #else
              #define Greeting "Hi."
              #endif
              std::cout<<Greeting << std::endl;


              #if VERSION == 3
              ...
              #elif VERSION == 4
              ...
              #else
              ...
              #endif


            5)標(biāo)準(zhǔn)的預(yù)處理器宏
              __LINE__     當(dāng)前源文件中的代碼行號(hào),十進(jìn)制整數(shù)
              __FILE__   源文件的名稱,字符串字面量
              __DATE__  源文件的處理日期,字符串字面量,格式mmm dd yyyy其中mmm是月份如Jan、Feb等 dd是01-31 yyyy是四位的年份
              __TIME__    源文件的編譯 時(shí)間,也是字符串字面量格式是hh:mm:ss
              __STDC__   這取決于實(shí)現(xiàn)方式,如果編譯器選項(xiàng)設(shè)置為編譯標(biāo)準(zhǔn)的C代碼,通常就定義它,否則就不定義它
              __cplusplus  在編譯C++ 程序時(shí),它就定義為199711L

              使用#line可以修改__FILE__返回的字符串
              如
              #line 1000    把當(dāng)前行號(hào)設(shè)置為1000
              #line 1000 "the program file"      修改__FILE__返回的字符串行號(hào)改為了1000,文件名改為了"the program file"
              #line __LINE__ "the program file"  修改__FILE__返回的字符串行號(hào)沒變,文件名改為了"the program file"

              cout << "program last complied at "<<__TIME__
                   << " on " << __DATE__
                   << endl;


            6)#error
              在預(yù)處理階段,如果出現(xiàn)了錯(cuò)誤,則#error指令可以生成一個(gè)診斷 消息,并顯示為一個(gè)編譯錯(cuò)誤,同時(shí)中止編譯
              #ifndef __cplusplus
              #error "Error -  Should be C++"
              #endif


            7)#pragma
             專門用于實(shí)現(xiàn)預(yù)先定義好的選項(xiàng),其結(jié)果在編譯器說明文檔中進(jìn)行了詳細(xì)的解釋。編譯器未識(shí)別出來的#pragma指令都會(huì)被忽略


            8)assert()宏
              在標(biāo)準(zhǔn)庫頭文件<cassert>中聲明
              用于在 程序 測試一個(gè)邏輯表達(dá)式,如果邏輯表達(dá)式為false, 則assert()會(huì)終止 程序,并顯示診斷 消息
              用于在條件不滿足就會(huì)出現(xiàn)重大錯(cuò)誤,所以應(yīng)確保后面的語句不應(yīng)再繼續(xù)執(zhí)行,所以它的應(yīng)用非常靈活
              注意: assert不是錯(cuò)誤處理 機(jī)制,邏輯表達(dá)式的結(jié)果不應(yīng)產(chǎn)生負(fù)面效果,也不應(yīng)超出 程序員的控制(如找開一個(gè)文件是否成功), 程序應(yīng)提供適當(dāng)?shù)拇a來處理這種情況
             assert(expression);
              assert(expression) && assert(expression2);
              可以使用#define NDEBUG來關(guān)閉斷言 機(jī)制

              #include <iostream>
              #include <cassert>
              using std::cout;
              using std::endl;

              int main()
              {
                 int x=0;
                 int y=0;

                 cout<<endl;

                 for(x=0; x<20; x++)
                 {
                    cout<<"x= "<<x <<" y= "<<y<<endl;
                    assert(x<y); //當(dāng)x>=y與x==5時(shí),就報(bào)錯(cuò),并終止 程序的執(zhí)行
                 }
                 return 0;
              }

            posted @ 2008-01-03 13:59 茶 閱讀(3545) | 評論 (1)編輯 收藏

            僅列出標(biāo)題
            共4頁: 1 2 3 4 
            国产午夜精品理论片久久| 欧美亚洲日本久久精品| 久久综合狠狠综合久久综合88| 国内精品伊人久久久影院| 狠狠色丁香久久婷婷综合蜜芽五月| 久久综合综合久久综合| 成人资源影音先锋久久资源网| 久久免费香蕉视频| 欧美精品久久久久久久自慰| 国产亚洲成人久久| 久久久老熟女一区二区三区| 精品久久久无码中文字幕| 久久影院综合精品| 理论片午午伦夜理片久久 | 精品免费tv久久久久久久| 韩国三级中文字幕hd久久精品 | 国产精品青草久久久久婷婷| 久久夜色撩人精品国产| 国产精品久久波多野结衣| 午夜精品久久久久| 久久精品免费网站网| 精品国产91久久久久久久| 97精品依人久久久大香线蕉97| 精品国产乱码久久久久久浪潮 | 狠狠色丁香久久婷婷综合图片| 一本伊大人香蕉久久网手机| 麻豆AV一区二区三区久久| 久久强奷乱码老熟女网站| 久久国产成人午夜aⅴ影院| 久久九九精品99国产精品| 中文字幕热久久久久久久| 日本加勒比久久精品| 久久本道久久综合伊人| 国产精品成人久久久久三级午夜电影| 久久综合综合久久综合| 欧美大香线蕉线伊人久久| 婷婷久久香蕉五月综合加勒比| 久久午夜无码鲁丝片秋霞| 亚洲欧美精品一区久久中文字幕| 国产精品美女久久久免费| 国产精品伊人久久伊人电影 |