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

讀檔如何一次讀1byte

尚未結案
alvinken
初階會員


發表:21
回覆:32
積分:45
註冊:2008-06-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-06-10 08:51:34 IP:218.170.xxx.xxx 未訂閱
因為程式需求,所以讀檔要一次讀1byte來運算<br \>


[code cpp]
ifstream InFile(OpenDialog1->FileName.c_str(),ios::binary);

InFile.read((char*)TestStruct,sizeof(TestStruct));
[/code]


這個語法一次會4byte讀取,所以想問有沒有一次讀1byte的語法

還是只能用這個語法 再 配合陣列來達到目的

或是有更好的方法來達到,煩請賜教,感激不盡
------
水至清則無魚,人至賤則無敵。
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-06-10 13:35:40 IP:61.219.xxx.xxx 訂閱


[code cpp]

InFile.read((char*)TestStruct,sizeof(TestStruct));

[/code]

上面的sizeof(TestStruct)就是控制你一次讀多少Byte的地方

可能剛好是你的sizeof(TestStruct)結構==4所以才會一次讀4Byte

若是你要一次讀1Byte

可以直接指定如下

[code cpp]

InFile.read((char*)TestStruct,1);

[/code]
編輯記錄
daldal 重新編輯於 2008-06-10 13:36:30, 註解 無‧
alvinken
初階會員


發表:21
回覆:32
積分:45
註冊:2008-06-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-06-10 14:30:10 IP:218.170.xxx.xxx 未訂閱
之所以會用 sizeof(TestStruct) 是因為我要將 內容讀進 這個結構裡 <br \>
但不知為啥 sizeof(TestStruct)會等於 4

我以為這樣寫會將資料依照定義好的資料型態丟進 結構裡,還是我的觀念有點錯誤


Struct內容大致於下


[code cpp]
Struct TestStruct
{
char WData[2];
char VData[4];
char WLine[7];
int DData;
char PData[2];
char CP[2];
int count;
};
[/code]




我的另一個作法是用陣列讀出 再丟進這個結構裡

但是會有點土法練鋼,而且後續會難debug



------
水至清則無魚,人至賤則無敵。
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-06-11 10:12:58 IP:61.219.xxx.xxx 訂閱
好像不是要一次讀一個Byte? 而是要一次讀一個結構內容?
如果一次要讀一個結構的話,是直接用sizeof(TestStruct)沒錯
以下是我用TMemoryStream測試的結果

[code cpp]
TestStruct ptest; //宣告一個ptest存放資料
ptest.WData[0]=1;
ptest.WData[1]=2;
ptest.VData[0]=3;
ptest.VData[1]=4;
ptest.VData[2]=5;
ptest.VData[3]=6;
ptest.WLine[0]=7;
ptest.WLine[1]=8;
ptest.WLine[2]=9;
ptest.WLine[3]=10;
ptest.WLine[4]=11;
ptest.WLine[5]=12;
ptest.WLine[6]=13;
ptest.PData[0]=14;
ptest.PData[1]=15;
ptest.DData=16;
ptest.CP[0]=17;
ptest.CP[1]=18;
ptest.count=19;

TMemoryStream *vcl = new TMemoryStream(); //建立MemoryStream
vcl->Write(&ptest,sizeof(ptest)); //ptest內容寫入MemoryStream
vcl->Position=0; //位置歸零

TestStruct ptest2; //宣告一個ptest2用來測試取資料
vcl->Read(&ptest2,sizeof(ptest)); //MemoryStream內容讀進ptest2
delete vcl;

[/code]

測試的結果,利用中斷去看整個結構,都有寫進去ptest>>>vcl(MemoryStream)>>>ptest2
that's all~
alvinken
初階會員


發表:21
回覆:32
積分:45
註冊:2008-06-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-06-11 12:05:49 IP:218.170.xxx.xxx 未訂閱
感謝這位大大花時間測試 <br \>
不過,我要讀的內容是 一個檔案的內碼,也就是十六進位的內容

如 { 4143 3130 3132 0000 0000 1111....)

然後將這些內容讀進我 定義好的結構裡,但是會發生 一次 4byte的讀取

不能將每個值都完全讀到自定的結構裡

會跳過一些值,可能是 sizeof(struct)會辨斷成 4吧
------
水至清則無魚,人至賤則無敵。
hdilwy
初階會員


發表:18
回覆:65
積分:41
註冊:2004-08-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-06-17 10:14:50 IP:219.86.xxx.xxx 訂閱
疑問;
如果以其struct內容來看
sizeof() 應該不只等於4吧
為何會造成這樣的情況
可以請有經驗的人解說一下嗎?
alvinken
初階會員


發表:21
回覆:32
積分:45
註冊:2008-06-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-06-18 10:31:39 IP:218.170.xxx.xxx 未訂閱

恩~我有show出我定義的那個 struct的size是 28

但是依我定義的內容來看應該只有25才對

好像struct裡如果定義了佔不同byte的型態,就無法依序讀取檔案裡的內容

有些內容會被跳過miss掉,也不知是啥原因,可能是概念問題吧

但是目前查到的資料也沒能解釋這樣的狀況的
------
水至清則無魚,人至賤則無敵。
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-06-20 15:51:47 IP:220.130.xxx.xxx 訂閱
忽然想到一個可能發生錯誤的地方

[code cpp]
InFile.read((char*)TestStruct,sizeof(TestStruct));
[/code]

可以把(char*)TestStruct 改成&TestStruct試試看嗎?
或者把sizeof(TestStruct)強制換成28試試看

如果這樣子改可以正常Work的話
有可能程式碼中間有強制轉換型態
(char*)TestStruct有可能就是兇手之一

以上純屬猜測,請自行測試囉 :p
alvinken
初階會員


發表:21
回覆:32
積分:45
註冊:2008-06-09

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-06-23 16:04:20 IP:218.170.xxx.xxx 未訂閱
呵~ sizeof(TestStruct)在程式中的值 就是28,所以強制改28也是一樣的效果<br \>
至於另一個方法 我好像也有試過,好像得到很怪的結果

我最後是改用別種寫法啦,只是我還是很想知道為啥這樣定義

就無法將檔案中的值依序準確配置到 Struct的變數裡

------
水至清則無魚,人至賤則無敵。
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-06-24 15:24:50 IP:59.125.xxx.xxx 訂閱
是阿,為何是 28 呢?

你可以思考

sizeof(char)
sizeof(char *)
sizeof(char[])
sizeof(char[2])

差異在哪裡!想一想,馬上說穿答案,就沒意思了



===================引 用 alvinken 文 章===================
呵~ sizeof(TestStruct)在程式中的值 就是28,所以強制改28也是一樣的效果

至於另一個方法 我好像也有試過,好像得到很怪的結果

我最後是改用別種寫法啦,只是我還是很想知道為啥這樣定義

就無法將檔案中的值依序準確配置到 Struct的變數裡
hdilwy
初階會員


發表:18
回覆:65
積分:41
註冊:2004-08-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-06-24 15:57:36 IP:59.124.xxx.xxx 訂閱
sizeof(char) = 1
sizeof(char *) = 4
sizeof(char[]) = ? (想不到)
sizeof(char[2]) = 4 (猜的)

這個問題的確很有趣,
不過我有請教我朋友,
他對於為啥不是25而是28,
給了一個很有趣的猜測,

他說如果是1byte alignment來看的話會是我們所慣性思考的25bytes
但是如果是4byte alignment來看的話就會是28bytes

這真是個很有趣的問題
希望能引發熱烈的討論
===================引 用 syntax 文 章===================
是阿,為何是 28 呢?

你可以思考

sizeof(char)
sizeof(char *)
sizeof(char[])
sizeof(char[2])

差異在哪裡!想一想,馬上說穿答案,就沒意思了



===================引 用 alvinken 文 章===================
呵~ sizeof(TestStruct)在程式中的值 就是28,所以強制改28也是一樣的效果

至於另一個方法 我好像也有試過,好像得到很怪的結果

我最後是改用別種寫法啦,只是我還是很想知道為啥這樣定義

就無法將檔案中的值依序準確配置到 Struct的變數裡
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-06-26 20:55:51 IP:220.130.xxx.xxx 訂閱
有點被您搞糊塗了...
既然sizeof(TestStruct) 大小是28,
Stream的read方式也沒有問題的話,
怎麼可能我這邊可以成功寫入, 讀取,
你那邊不能呢 @@?
會不會是Stream的Position沒有移到檔頭, 所以沒讀到資料?
還是其他部分造成的影響呢?
可以麻煩另外開一個新的專案,只測試讀取寫入部分
這樣子問題會比較好釐清喔。
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-06-27 08:01:13 IP:218.166.xxx.xxx 訂閱
Project->Option->Advanced Compiler->Data Alignment 選 byte 看看.
系統時間:2024-04-24 2:29:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!