作者bleed1979 (十三)
看板C_and_CPP
標題Re: [問題] 一個讀檔的問題
時間Sat Dec 25 09:55:12 2010
稍微找了一下網路上的說明文件,
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