看板 C_and_CPP 關於我們 聯絡資訊
稍微找了一下網路上的說明文件, dwSize應該是指這個區塊裡不包含FOURCC和dwSize本身的大小。 應可用來推測entry陣列的數量。不過我沒有細讀,大概像以下這樣: 我先隨意地填值寫在檔案裡,只註解推測dwSize的用法。 #include <cstdio> typedef unsigned int FOURCC; typedef unsigned int DWORD; typedef struct { FOURCC idxFourCC; DWORD dwSize; struct avioldindex_entry { DWORD ckid; DWORD dwFlags; DWORD dwChunkOffset; DWORD dwChunkLength; }*aIndex; }AVIINDEXENTRY; typedef AVIINDEXENTRY::avioldindex_entry entry_type; int main() { FILE *fout = fopen("test.txt", "w"); if(fout == NULL) { puts("error to open file"); return 1; } FOURCC cc4 = 123; DWORD entry_size = 3 * sizeof(entry_type); fwrite(&cc4, sizeof(cc4), 1, fout); fwrite(&entry_size, sizeof(entry_size), 1, fout); entry_type obj; obj.ckid = 1; obj.dwFlags = 0; obj.dwChunkOffset = 0; obj.dwChunkLength = 44; fwrite(&obj, sizeof(obj), 1, fout); obj.ckid = 2; obj.dwFlags = 1; obj.dwChunkOffset = 0; obj.dwChunkLength = 55; fwrite(&obj, sizeof(obj), 1, fout); obj.ckid = 3; obj.dwFlags = 0; obj.dwChunkOffset = 0; obj.dwChunkLength = 66; fwrite(&obj, sizeof(obj), 1, fout); fclose(fout); FILE *fin = fopen("test.txt", "r"); if(fin == NULL) { puts("error to open file"); return 1; } AVIINDEXENTRY idx1; fread(&idx1.idxFourCC, sizeof(idx1.idxFourCC), 1, fin); fread(&idx1.dwSize, sizeof(idx1.dwSize), 1, fin); printf("%u\n%u\n", idx1.idxFourCC, idx1.dwSize); // 根據dwSize推測entry的數量 unsigned int entry_q = idx1.dwSize / sizeof(entry_type); idx1.aIndex = new entry_type[entry_q]; // 配置空間 for(unsigned int i = 0; i != entry_q; ++i) { fread(&idx1.aIndex[i], sizeof(entry_type), 1, fin); printf("%u\n%u\n%u\n%u\n", idx1.aIndex[i].ckid, idx1.aIndex[i].dwFlags, idx1.aIndex[i].dwChunkOffset, idx1.aIndex[i].dwChunkLength); } delete[] idx1.aIndex; idx1.aIndex = 0; fclose(fin); return 0; } ※ 引述《Arim (Arim5566)》之銘言: : 開發平台(Platform): (Ex: VC++, Gcc, Linux, ...) : linux,g++ : 額外使用到的庫(Library Used) (Ex: OpenGL, ...) : 問題(Question): : 用structure讀檔的使用問題 : 餵入的資料(Input): : typedef struct { : FOURCC idxFourCC; : DWORD dwSize; : struct avioldindex_entry : { : DWORD ckid; : DWORD dwFlags; : DWORD dwChunkOffset; : DWORD dwChunkLength; : }aIndex[]; : } AVIINDEXENTRY; : 預期的正確結果(Expected Output): : 小弟目前是想把avi裏面的idx1的區塊給讀出來 : 他的格式是最前面兩個分別代表idx以及size(idxFourCC && dwSize) : 後面都是以16個byte為一組的陣列 : AVIINDEXENTRY idx1; : fread(&idx1,sizeof(idx1),1,pfAvi); : 只是在idx1.aIndex[0].ckid這邊就錯了,前面的idxFourCC跟dwSize都有讀出來, : 我是用UltraEdit去做比對的@@,之後我試著在idxFourCC跟dwSize讀完之後(這邊有 : 把aIndex的structure給註解掉) : 再利用一個DWORD去讀,反而有正確讀出來 : 在這邊不知道是不是小弟的structure寫的方式不對? : 另外還有一點疑惑的事,aIndex是一個陣列(aIndex[]),只是沒有給陣列的大小 : 困惑的是fread裏面的sizeof要怎麼找出aIndex[]的大小? : 麻煩各位版友指正了@@ 謝謝 : 錯誤結果(Wrong Output): : 程式碼(Code): (請善用置底文標色功能) : 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.177.97
Arim:謝謝大大 這方法我之前也以想過, 只是不知道我的structure寫 12/25 11:09
Arim:的方式不知道對不對@@ 12/25 11:09
Arim:難道 type aIndex[] = type* aIndex ? 12/25 11:11
bleed1979:我覺得不一樣,因為寫[],sizeof似乎不會計算到。 12/25 15:28
bleed1979:可以寫個小程式,輸出sizeof struct來比較看看。 12/25 15:29
Arim:但是不知道為什麼compile會過@@ 12/25 15:50
loveme00835:compile會過 means 'nothing' 12/25 15:57
deh3215:會過不代表執行不會當機 12/25 16:58
Bencrie:我想那個應該跟陣列[0]一樣意思吧 ... 一種檔頭的用法 12/25 17:07
Bencrie:這種陣列只能用在 struct 的最後一個 field,表示後面都是 12/25 17:08
Bencrie:一樣的東西。 12/25 17:08
LPH66:樓上正確 我久遠之前回過類似的問題: #1AY_NFx1 12/25 18:13