亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言采用文本方式和二進制方式打開文件的區別分析

2020-01-26 15:28:31
字體:
來源:轉載
供稿:網友

稍微了解C程序設計的人都知道,文本文件和二進制文件在計算機上面都是以0,1存儲的,那么兩者怎么還存在差別呢?對于編程人員來說,文本文件和二進制文件就是一個聲明,指明了你應該以什么方式(文本方式/二進制)打開這個文件,用什么函數讀寫這個文件(讀寫函數),怎么判斷讀到這個文件結尾等。

具體分析如下:

一、以哪種方式打開一個文件

ANSI C規定了標準輸入輸出函數庫,用 fopen()函數打開文件。fopen()函數的調用方式一般為:
FILE *fp;
fp=fopen(文件名,使用文件方式);
使用文件方式見下表:

使用文件方式 含義
"r"(只讀) 為輸入打開一個文本文件
"w"(只寫) 為輸出打開一個文本文件
"a"(追加) 為追加打開一個文本文件
"rb"(只讀) 為輸入打開一個二進制文件
"wb"(只寫) 為輸出打開一個二進制文件
"ab"(追加) 為追加打開一個二進制文件
"r+"(讀寫) 為讀/寫打開一個文本文件
"w+"(讀寫) 為讀/寫創建一個文本文件
"a+"(讀寫) 為讀/寫打開一個文本文件
"rb+"(讀寫) 為讀/寫打開一個二進制文件
"wb+"(讀寫) 為讀/寫創建一個二進制文件
"ab+"(讀寫) 為讀/寫打開一個二進制文件

同一個文件從磁盤讀取文件到內存(程序數據區或者緩存區)時,兩種方式下,內存中的內容一般不相同,這就是兩種打開方式的實質性差別。
這里要說一個背景,那就是在windows下,它會做一個處理,就是寫文件時,換行符會被轉換成回車,換行符存在磁盤文件上,而讀磁盤上的文件時,它又會進行逆處理,就是把文件中連續的回車,換行符轉換成換行符。
因此,在讀取一個磁盤文件時,文本方式讀取到文件內容很有可能會比二進制文件短,因為文本方式讀取要把回車,換行兩個字符變成一個字符,相當于截短了文件。但是為什么僅僅是可能呢?因為可能文本中不存在連著的45,42這兩個字節(45是CR回車的ASCII碼,42是換行符CL的ASCII碼),也就不存在“截短”操作了,因此讀到的內容是一樣的。
具體的來說,文件文件(以文本方式寫的),最好以文本方式讀。二進制文件(以二進制方式寫的),最好以二進制方式讀。不然可能會不正確。

二、以什么函數讀寫文件

數據怎么在磁盤上寫不是由文件打開方式決定的,而是由寫函數決定的。數據怎么從磁盤上讀也不是由文件打開方式決定的,而是由讀函數決定的。
上面說的數據怎么寫是指,一種類型的變量是怎么存的?比如int 12,可以直接存12的二進制碼(4個字節),也可以存字符1,字符2.
數據怎么讀的是指,我要讀一個int變量,是直接讀sizeof(int)個字節,還是一個字符一個字符的讀,直到讀到的字符不是數字字符。

C里面有兩組文件讀寫函數恰好支持上面兩種方式的讀寫:

1.fread(buffer,size,count,fp),fwrite(buffer,size,count,fp)。用來讀寫一個數據塊。它對應的是第一種存儲方式。直接按類型的字節長度指定讀寫的字節數。

2.fprintf函數和fscanf函數.它對應的是第二種讀寫方式。即以字符的方式讀寫。(fprintf函數、fscanf函數與printf函數、scanf函數的作用相仿,都是格式化讀寫函數。fprintf和fscanf函數的讀寫對象是磁盤文件,而printf和scanf函數的讀寫對象是終端。)
它們的一般調用格式為:

fprintf(文件指針,格式字符串,輸出列表);fscanf (文件指針,格式字符串,輸入列表);

三、怎么判斷文件尾

在C語言,或更精確地說成 C標準函式庫中,有一個特別的字符EOF(stdio.h中這個定義 #define EOF (-1) ),它表示:文件結束符(end of file)。在while循環中以EOF作為文件結束標志,這種以EOF作為文件結束標志的文件,必須是文本文件。在文本文件中,數據都是以字符的ASCII代碼值的形式存放。我們知道,ASCII代碼值的范圍是0~255,不可能出現-1,因此可以用EOF作為文件結束標志。

但是,C語言中,當把數據以二進制形式存放到文件中時,就會有-1值的出現,此時不能采用EOF作為二進制文件的結束標志。為解決這個問題,ANSI C提供一個feof函數,用來判斷文件是否結束。如果遇到文件結束,函數feof(fp)的值為1,否則為0.
feof函數既可用以判斷二進制文件是否結束,也可以用以判斷文本文件是否結束。但是要注意feof用以判斷文本文件尾時,如果代碼編寫不當,可能會把文本文中中的文件結束符EOF也讀取出來了;具體可以參考http://baike.baidu.com/view/656648.htm中feof函數的用法。

四、知道一個文件是文本文件,還是二進制文件,更多的“提醒”我們,應該選擇哪種讀寫函數。

正如前文所說的,數據怎么存不是由文件打開方式決定的,而是由讀寫函數決定的。
比如說,我們以二進制文件的方式打開一個文件(實際上只是指明了要進行換行符的轉換),它更多的是代表一種理念(虛的):我“希望”這個文件里面的數據是這樣的,int類型占4字節,char占1個字節。這種模式下,我用fread(buffer,size0f(int),1,fp)讀取一個int到int變量中。

這里需要記?。?/strong>

我們在對一個文件進行操作以前,首先,我們要清楚這個文件到底是文本文件還是二進制文件。文件文件用文本方式打開,二進制文件用二進制方式打開
如果我們要操作一個二進制文件,那么我們就以二進制方式打開(理論上也可以以文件方式打開,但是如果寫的二進制數據里面有45時,會轉化成45,42存儲,如前文所述。這是很有可能發生的)。同時讀寫的時候用fread,fwrite這兩個函數。
如果我要操作一個文本文件,那么我們就以文本的方式打開(理論上也可以以二進制方式打開,但是不保險)。同時讀寫的時候用讀寫字符的那些函數fprintf,fscanf ,fgetc,fputc,putw,getw,fgetc,fputs.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
韩国福利视频一区| 俺去亚洲欧洲欧美日韩| 欧美久久久精品| 欧美精品九九久久| 深夜福利一区二区| 亚洲一区美女视频在线观看免费| 亚洲精品动漫久久久久| 欧美视频在线视频| 成人伊人精品色xxxx视频| 性色av一区二区咪爱| 日韩av在线电影网| 中文字幕亚洲欧美在线| 精品国产一区二区三区久久狼黑人| 日韩美女免费观看| 日韩精品视频在线观看网址| 成人免费在线网址| 欧美成人精品h版在线观看| 久久全球大尺度高清视频| 久久久久久中文字幕| 清纯唯美亚洲激情| 成人免费在线视频网站| 国产成人精品在线视频| 91av在线视频观看| 欧美极品在线播放| 欧美国产日韩精品| 福利精品视频在线| 精品久久久香蕉免费精品视频| 欧美亚洲国产精品| 日本不卡免费高清视频| 91精品综合久久久久久五月天| 国产精品18久久久久久首页狼| 国产一区av在线| 亚洲欧美一区二区三区情侣bbw| 久久天天躁夜夜躁狠狠躁2022| 国产精品久久精品| 一区二区国产精品视频| 欧美日韩亚洲一区二| www.日韩av.com| 精品日本美女福利在线观看| 国产丝袜一区二区| 亚洲午夜久久久久久久| 性亚洲最疯狂xxxx高清| 91爱爱小视频k| 日韩欧美高清在线视频| 欧美亚洲国产视频| 亚洲午夜未删减在线观看| 欧美亚洲国产精品| 亚洲女在线观看| 亚洲iv一区二区三区| 欧美一级片久久久久久久| 国产xxx69麻豆国语对白| 中文字幕日韩有码| 97在线免费视频| 日韩精品视频观看| 欧美怡红院视频一区二区三区| 日韩电视剧在线观看免费网站| 欧美日韩在线视频一区| 日韩高清电影好看的电视剧电影| 欧美成人精品一区二区| 国产主播喷水一区二区| 91精品国产91久久| 欧美人在线视频| 欧美性xxxx极品高清hd直播| 成人免费看吃奶视频网站| 中文字幕少妇一区二区三区| 欧美主播福利视频| 久久精品成人欧美大片古装| 日韩精品免费在线视频观看| 亚洲伦理中文字幕| 国产欧美一区二区三区在线| 亚洲精品98久久久久久中文字幕| 国产91色在线|免| 日韩美女毛茸茸| 综合136福利视频在线| 色综合亚洲精品激情狠狠| 亚洲国产欧美日韩精品| 成人国产精品日本在线| 国产999精品| 亚洲视频在线观看| 国产精品视频成人| 亚洲mm色国产网站| 亚洲精品免费网站| 亚洲视频在线观看网站| 777午夜精品福利在线观看| 91国产精品视频在线| 精品亚洲国产成av人片传媒| 国产精品永久免费在线| 亚洲va欧美va国产综合剧情| 日韩在线视频免费观看| 亚洲免费电影一区| 色综合伊人色综合网站| 久久人体大胆视频| 在线观看欧美成人| 久久全国免费视频| 777精品视频| 日韩一区二区福利| 亚洲欧洲国产伦综合| 国产aⅴ夜夜欢一区二区三区| 在线观看免费高清视频97| 456国产精品| 国产精品久久久91| 精品在线小视频| 国产91精品最新在线播放| 亚洲v日韩v综合v精品v| 亚洲男人天堂网站| 午夜精品免费视频| 久久久免费在线观看| 国产一区二区欧美日韩| 日韩在线国产精品| 久久久国产成人精品| 亚洲国产精品久久| 亚洲成av人影院在线观看| 午夜精品蜜臀一区二区三区免费| 中文字幕亚洲无线码a| 久久91精品国产91久久久| 日韩欧美国产成人| 91精品免费久久久久久久久| 色哟哟亚洲精品一区二区| zzijzzij亚洲日本成熟少妇| 国产精品一区二区三| 日韩a**站在线观看| 欧美日韩国产精品专区| 97视频免费在线观看| 91久久久国产精品| 久久久精品999| 国产精品亚洲片夜色在线| 亚洲午夜精品久久久久久久久久久久| 亚洲激情免费观看| 懂色av中文一区二区三区天美| 国产精品无码专区在线观看| 欧美在线视频一二三| 91久久久亚洲精品| 91国产精品电影| 97碰碰碰免费色视频| 欧美裸体xxxx极品少妇| 国产精品久久久久久久午夜| 午夜精品久久久久久久99热| 国产精品自产拍高潮在线观看| 欧美激情亚洲国产| xxxxxxxxx欧美| 精品日本美女福利在线观看| 亚洲午夜av久久乱码| 一道本无吗dⅴd在线播放一区| 亚洲精品v欧美精品v日韩精品| 视频直播国产精品| 色老头一区二区三区在线观看| 动漫精品一区二区| 亚洲欧美激情视频| 91精品视频观看| 亚洲va电影大全| 亚洲一级黄色av| 久久精品91久久香蕉加勒比| 日韩免费高清在线观看| 黄色91在线观看| 91欧美精品成人综合在线观看| 亚洲精品一区在线观看香蕉| 日韩精品高清在线观看| 欧美性videos高清精品| 成人免费网视频| 日韩欧美中文在线| 亚洲精品一区二区在线| 国产精品免费看久久久香蕉| 欧美大成色www永久网站婷| 国产成人亚洲综合91精品|