全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2938
推到 Plurk!
推到 Facebook!

二進制檔案

答題得分者是:yorkland
yshihyu
一般會員


發表:23
回覆:18
積分:8
註冊:2006-11-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-02-16 07:41:20 IP:59.104.xxx.xxx 訂閱
<textarea class="cpp" rows="10" cols="60" name="code">#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("list.txt","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]} %s\n",qq->name,qq->num,qq->age,qq->addr); fclose(fp); system("pause"); } </textarea>

if((fp=fopen("list.txt","wb "))==NULL) // 我這邊用wb 二進制檔案 書上說例如值輸入5678 那我文件list 裡面應該是以二進制去存應該為00010110 00101110 不過我看他還是直接以5678表示 想請問這是怎麼回事??


1.書上說二進制表示法比ASCII 更省空間 , 那什麼情況下要去使用ASCII 或是 二進制???
2.二進制可以表示A~Z 或是一些特殊的字元嗎??? 因為我看書上都是舉例10進制數字, 還是二進制表示只能存放數字???


謝謝


yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-02-16 09:10:58 IP:59.124.xxx.xxx 訂閱
以下個人的理解, 僅供參考。
上述提到的二進制, 指的應該是Binary File。
例如: 型別Word是2個Bytes, 但它可以儲存0..65535的數字。
如果用Binary的方式儲存, 例如要儲存數字5678時, 以Ascii至少要花4個Chars(Bytes)儲存, 數字位元越多, 所需的Bytes數也越大, 但是只要數字範圍在65535以內的, 以Binary模式只要花2個Bytes。
書裡頭的意思可能是這樣, 一般來說, 如果要寫檔, 儲存數字類的資料(如: Int, Double, Word, DWord, DateTime...), 我會以Binary的方式寫檔。文字型的(String, Char...)也只能用Char(Ascii)的方式填資料。
yshihyu
一般會員


發表:23
回覆:18
積分:8
註冊:2006-11-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-02-16 09:37:25 IP:59.104.xxx.xxx 訂閱
<textarea class="cpp" rows="10" cols="60" name="code">/* prog 12-13,文字模式儲存1000個亂數值 */ #include #include #include #define MAXI 1000 int main(void) { int i=0; FILE *fptr1; fptr1=fopen("c:\\c_prog\\abc.txt","w"); if(fptr1!=NULL) { srand((unsigned)time(NULL)); for(i=0;i #include #include #define MAXI 1000 int main(void) { int i=0,buffer; FILE *fptr1; fptr1=fopen("c:\\c_prog\\abc.bin","wb"); if(fptr1!=NULL) { srand((unsigned)time(NULL)); for(i=0;i

上面兩個是書上範例在說明Ascii 與 Binary 存放檔案大小
文字模式需要 1000 * 10 1000(空格) = 11000 byte
二進制模式需要 只需要4000 byte

我的疑問是我把 fptr1=fopen("c:\\c_prog\\abc.txt","w"); 改成 wb 大小還是 11000byte
是二進制不能用 fprintf() 函式去存嗎?? 只能用fwrite() 去存二進制是這樣嗎???
fprintf() 函式好像參數無2進制
還有fwrite(&buffer,sizeof(int),1,fptr1); // 這邊sizeof(int) 是指文件檔一個區塊可以存4byte 大小的整數資料嗎???

謝謝
yshihyu
一般會員


發表:23
回覆:18
積分:8
註冊:2006-11-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-02-16 09:46:34 IP:59.104.xxx.xxx 訂閱

===================引 用 文 章===================
以下個人的理解, 僅供參考。
上述提到的二進制, 指的應該是Binary File。
例如: 型別Word是2個Bytes, 但它可以儲存0..65535的數字。
如果用Binary的方式儲存, 例如要儲存數字5678時, 以Ascii至少要花4個Chars(Bytes)儲存, 數字位元越多, 所需的Bytes數也越大, 但是只要數字範圍在65535以內的, 以Binary模式只要花2個Bytes。
書裡頭的意思可能是這樣, 一般來說, 如果要寫檔, 儲存數字類的資料(如: Int, Double, Word, DWord, DateTime...), 我會以Binary的方式寫檔。文字型的(String, Char...)也只能用Char(Ascii)的方式填資料。

__________________________________________________________________________________________________

那二進制也是可以表示 A~ Z 英文字嗎??? 如果我要存放的資料有(字串數字都有)
那只能用ASCII 去表示嗎??? 二進制感覺應該也可以表示字串是吧???

謝謝

yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-02-16 13:17:42 IP:60.248.xxx.xxx 訂閱
二進位的存取, 就由程式控制呀, 存取的人要知道那幾個Bytes表示什麼意思, 所以當然可以把文字與數字存放在一起。
yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-02-16 13:31:40 IP:60.248.xxx.xxx 訂閱
附上一小段程式給你參考, 希望有助於你。
一般寫檔的資料結構要讓使用者知道, 例如常用的圖檔, 如BMP, TIF等...
裡頭包含了各種資訊, 如圖檔尺寸, 發行公司的資料, 解析度, 彩度, Pixel Data...
都有一定的規則, 告訴使用者如何解析Binary File。

procedure TForm1.Button1Click(Sender: TObject);
var
F: File;
Str: Array [0..9] of Char;
Value: Double;
FileName: String;
begin
FileName:='C:\Test.bin';
// Write data to file.
AssignFile(F,FileName);
Rewrite(F,1);
// 前面10個Bytes以文字方式寫入..
Str:='TEXT AREA1';
BlockWrite(F,Str,Length(Str));
Value:=1000.001;
BlockWrite(F,Value,SizeOf(Double));
CloseFile(F);
// **************************************
// Try to read the data
AssignFile(F,FileName);
Reset(F,1);
BlockRead(F,Str,Length(Str));
ShowMessage(Str);
BlockRead(F,Value,SizeOf(Double));
ShowMessage(FloatToStr(Value));
CloseFile(F);
end;
yshihyu
一般會員


發表:23
回覆:18
積分:8
註冊:2006-11-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-02-16 13:32:22 IP:59.104.xxx.xxx 訂閱

===================引 用 文 章===================
<textarea class="cpp" rows="10" cols="60" name="code">/* prog 12-13,文字模式儲存1000個亂數值 */ #include #include #include #define MAXI 1000 int main(void) { int i=0; FILE *fptr1; fptr1=fopen("c:\\c_prog\\abc.txt","w"); if(fptr1!=NULL) { srand((unsigned)time(NULL)); for(i=0;i #include #include #define MAXI 1000 int main(void) { int i=0,buffer; FILE *fptr1; fptr1=fopen("c:\\c_prog\\abc.bin","wb"); if(fptr1!=NULL) { srand((unsigned)time(NULL)); for(i=0;i

上面兩個是書上範例在說明Ascii 與 Binary 存放檔案大小
文字模式需要 1000 * 10 1000(空格) = 11000 byte
二進制模式需要 只需要4000 byte

我的疑問是我把 fptr1=fopen("c:\\c_prog\\abc.txt","w"); 改成 wb 大小還是 11000byte
是二進制不能用 fprintf() 函式去存嗎?? 只能用fwrite() 去存二進制是這樣嗎???
fprintf() 函式好像參數無2進制
還有fwrite(&buffer,sizeof(int),1,fptr1); // 這邊sizeof(int) 是指文件檔一個區塊可以存4byte 大小的整數資料嗎???

謝謝




_____________________________________________________________________________________________

我還剩下上面的疑問

謝謝
yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-02-16 13:41:14 IP:60.248.xxx.xxx 訂閱
Yes, 請用 fwrite。
fprintf 僅提供文字(ASCII)的部份。

fwrite(&buffer,sizeof(int),1,fptr1)
第二個參數代表前一個Buffer的Size, 而且Integer應該是8Bytes, 不是4Bytes (如果開發環境是32位元)。
表示寫入檔案時, 占用了幾個Bytes。
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-02-16 13:49:51 IP:218.170.xxx.xxx 未訂閱
嗯。。。。我們先了解什麼叫 wb 的 b
你可以看到它都說它叫 binary
可是。你實際去了解它。有沒有b的差別
你可以發現。所謂的 b
只是說在存換行時。是以 \n 或是 \r\n 來儲存
就這樣的差別而已。
以這種解釋你再去看你的問題。
不知道有沒有回答了你的問題。新年快樂囉
yshihyu
一般會員


發表:23
回覆:18
積分:8
註冊:2006-11-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-02-16 14:08:55 IP:59.104.xxx.xxx 訂閱
非常感謝你們的解說

謝謝
系統時間:2024-05-01 4:56:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!