線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1322
推到 Plurk!
推到 Facebook!

ㄧ個使用memorystream的怪問題

答題得分者是:taishyang
watersoul
一般會員


發表:1
回覆:1
積分:0
註冊:2005-10-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-20 01:10:29 IP:218.175.xxx.xxx 未訂閱
最近在寫讀檔的程式,在使用memorystream時發現很奇怪的問題,我貼一下我寫的程式碼,不知道是布是我使用的方法錯誤,希望有那位大大可以幫我看看QQ 程式碼如下,主要目的是抓BMP檔的前2byte,判斷是否為BMP檔。 DWORD header_tmp1,header_tmp2,header_size; //宣告變數 String tmp; //用來站存比較值 TMemoryStream *file_tmp = new TMemoryStream(); file_tmp->LoadFromFile("test.bmp"); //讀檔 file_tmp->Position=0; //錢2BYTE可用來判斷是否為BMP file_tmp->Read(&header_tmp1,1); tmp=header_tmp1; //因為DWORD不能直接在IF中做比較所以用TMP暫存 if (tmp == IntToStr(66)) //判斷是否為BMP檔 { Memo1->Lines->Add(header_tmp1); file_tmp->Position=1; file_tmp->Read(&header_tmp2,1); tmp=header_tmp2; if (tmp == IntToStr(77)) {//開始取標頭資訊 Memo1->Lines->Add(header_tmp2); file_tmp->Position=2; //取檔案大小 file_tmp->Read(&header_size,4); // Memo1->Lines->Add(header_size);<-- 問題在這 } } delete file_tmp; 在上面箭頭的地方,如果有加上"//"也就是那行不作用則程式可以很正常的跑進第2個IF中,抓到的值弟一個為66,第2個為77。 但如果把"//"拿掉,則程式弟2個值會抓成589,這就是我困惑的地方,相同的資料來源者麼會抓到2種不同的值?而且變動的那行又是在抓到資料之後才執行的。 步知是否我在使用上有錯誤? PS:編譯器為BCB6.0,資料來源是一般普通的BMP檔
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-20 09:29:09 IP:203.69.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 > 關於您的問題,請將 >
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-20 09:37:24 IP:60.248.xxx.xxx 未訂閱
雖然你要用 file_temp->read 的時候,有設定好該讀取的長度 但是 header_temp1 被宣告成 DWORD,也就是說是 32bit 的整數 宣告了之後,你沒設初始值,所以,不知道其值為何 而讀取的時候,只讀了 2bytes 進來,所以會不知道剩下 2bytes 是啥 因此,你在讀取的時候,應該要先讓 header_temp1 = 0 (header_temp2 也比照辦理)    另外,要讀 2bytes 的東西,BCB 就有一個 short 可以用了 不需要繞來繞去,以下是我的寫法,請參考
    int HeaderSize;
    short HeaderID;
    TMemoryStream *file_temp = new TMemoryStream();
    file_temp->LoadFromFile("c:\\test.bmp");        file_temp->Position = 0;
    file_temp->Read(& HeaderID, 2);
    Memo1->Lines->Add(IntToHex(HeaderID, 4));        if(HeaderID == 0x4D42) { // 'BM'
        file_temp->Read(& HeaderSize, 4);
        Memo1->Lines->Add(IntToStr(HeaderSize));
    }        delete file_temp;
發表人 - reptile 於 2005/10/20 09:38:54
watersoul
一般會員


發表:1
回覆:1
積分:0
註冊:2005-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-20 09:47:03 IP:218.175.xxx.xxx 未訂閱
taishyang大 真是不好意思,下次問問題一定會改進^^" 原來是忘了設初值@@~問題結決了,真是太感謝了 不過竟然是錯在這種小地方,程式習慣要多加強了QQ 感謝感謝~
系統時間:2024-05-10 21:11:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!