• <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>
            posts - 297,  comments - 15,  trackbacks - 0
            今天在寫文件的時候發現fwrite的時候多出了一些亂碼,最后發現加個b,以二進制的方式打開文件就解決了,google了.... 特記與此

               在學習C語言文件操作后,我們都會知道打開文件的函數是fopen,也知道它的第二個參數是 標志字符串。其中,如果字符串中出現'b',則表明是以打開二進制(binary)文件,否則是打開文本文件。

              那么什么是文本文件,什么是二進制文件呢? 可能大多數人都沒有仔細考慮過。

              在Windows和DOS系統中,狹義的文本文件是指擴展名為txt的文件。實際上,那些沒有規定格式的,由可理解的的ASCII以及其他編碼文字組成的文件都是文本文件,如C源程序文件,HTML超文本,XML。除此之外的其他文件都是二進制文件,如Word文件DOC,圖象格式文件JPG。

              但是,所謂使用fopen標志打開文本文件與二進制文件的說法并不準確。正確的說法應該是--以文本方式和二進制方式打開文件。因為我們用兩種方式都可以任意的文件。

              即使這樣,為什么還要區分兩種方式呢?

              這是因為這兩種方式在讀寫文件時的操作是不一樣的。

              二進制方式很簡單,讀文件時,會原封不動的讀出文件的全部內容,寫的時候,也是把內存緩沖區的內容原封不動的寫到文件中。

              而文本方式就不一樣了,在寫文件時,會將換行符號CRLF(0x0D 0x0A)全部轉換成單個的0x0A,并且當遇到結束符CTRLZ(0x1A)時,就認為文件已經結束。相應的,寫文件時,會將所有的0x0A換成0x0D0x0A。

            所以,若使用文本方式打開二進制文件時,就很容易出現文件讀不完整,或內容不對的錯誤。即使是用文本方式打開文本文件,也要謹慎使用,比如復制文件,就不應該使用文本方式。

              要特別注意的是,上面這樣的說法僅適用于DOS和Windows系統。在Unix和其他一些系統中,沒有文本方式和二進制方式的區分,使不使用'b'標志都是一樣的。這是由于不同操作系統對文本文件換行符的定義,和C語言中換行符的定義有所不同而造成的。

              如上文已提到,DOS和Windows系統使用CRLF(0x0D 0x0A)雙字節作為文本文件換行符,而Unix文本文件的換行符只有一個字節LF(0x0A)為。在C語言中,也是以LF即'\n'為換行符。

              由于DOS/Windows定義的換行符和C語言的不一致,C語言的標準輸入輸出函數適行讀寫文本文件時,就適行了CRLF->LF的轉換。而Unix的定義和C語言的是一樣的,就不必轉換了。

              那么,為什么會有定義不一致的情況呢,這純屬歷史原因。當初C是在Unix上發展的,對換行的定義自然就一樣了。其后C被引入到DOS系統,為了使原有的C程序能不加修改的讀寫DOS的文本文件,所以就在文件讀寫上做了修改。隨著DOS/Windows成為主流平臺,這個當初為了兼容而做的修改給眾多的C語言開發者添了這樣一個小小的麻煩。
            from:
            http://blog.chinaunix.net/u2/76292/showart.php?id=2140344
            posted on 2010-01-05 20:23 chatler 閱讀(574) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
            <2011年5月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品嫩草影院| 日本久久久久亚洲中字幕| 久久久久亚洲av无码专区导航| 三上悠亚久久精品| 99久久精品国内| 亚洲女久久久噜噜噜熟女| 88久久精品无码一区二区毛片| 久久国内免费视频| 精品国产91久久久久久久a| 久久久久久亚洲AV无码专区| 久久91精品久久91综合| 欧美久久久久久精选9999| 亚洲国产成人久久综合碰| 国产精品狼人久久久久影院| 激情伊人五月天久久综合| 伊人久久大香线蕉AV色婷婷色| 亚洲精品乱码久久久久久蜜桃| 久久99精品久久久久婷婷| 色99久久久久高潮综合影院| 久久精品成人免费看| 伊人久久久AV老熟妇色| 日韩一区二区三区视频久久| 久久久久久综合一区中文字幕| 97超级碰碰碰久久久久| 久久精品aⅴ无码中文字字幕不卡| 久久亚洲精品无码aⅴ大香 | 久久婷婷久久一区二区三区| 热99RE久久精品这里都是精品免费| 久久国产免费直播| 亚洲婷婷国产精品电影人久久| 国内精品久久久久久久影视麻豆| 久久久久亚洲AV无码网站| 亚洲国产精品无码久久一线 | 久久伊人精品一区二区三区| 欧美色综合久久久久久| 久久狠狠一本精品综合网| AA级片免费看视频久久| 国产精品亚洲综合专区片高清久久久| 久久精品aⅴ无码中文字字幕重口| 色欲久久久天天天综合网| 波多野结衣AV无码久久一区|