Re: [問題] 讀取檔案內的stream來比較

看板C_and_CPP (C/C++)作者 (機機勳)時間15年前 (2011/06/12 00:48), 編輯推噓4(4061)
留言65則, 3人參與, 最新討論串2/3 (看更多)
接著上篇,我其實還有一個問題..... 上一篇我用的函式叫做nextbits() 假如我現在有一段code如下 do{ ........... }while(nextbits(fp)==sequence_header_code) 我把fp這個指向檔案的指標傳給nextbits這個函式,希望他傳回一個東西能夠跟 sequence_header_code來做比較,我應該怎麼改寫上一篇的函式呢...? unsigned char sequence_header_code[4]={0x00,0x00,0x01,0xb3}; void nextbits(FILE *f){ unsigned char sum[4]; fread( sum, sizeof(sum), 1, f ); if( !memcmp( sum,sequence_header_code,sizeof(sum) ) ){ printf("match");} } 就是說我希望不要在這個函式裡面做比較,這個函式只要能把讀到的值存到某 個array裡面,再傳出來就好了,比較的動作,就拿到外面來做。 不知道把sum傳出來要怎麼寫呢...? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.231.103.113

06/12 00:50, , 1F
1.放在參數傳回來 2.用回傳值
06/12 00:50, 1F

06/12 00:51, , 2F
要用回傳值就不要用void
06/12 00:51, 2F

06/12 00:52, , 3F
回傳值可以考慮用int
06/12 00:52, 3F

06/12 00:52, , 4F
來宣告
06/12 00:52, 4F

06/12 00:55, , 5F
至於seq就變成這樣int seq=0xb3010000;
06/12 00:55, 5F

06/12 00:59, , 6F
oh on....
06/12 00:59, 6F

06/12 01:02, , 7F
int 放不放得下都是個問題了, 哪來比較快?
06/12 01:02, 7F

06/12 01:02, , 8F
或者你要重載operator?
06/12 01:02, 8F

06/12 01:08, , 9F
標題搜尋: 回傳、陣列, 系列問題請用編輯內文來發問
06/12 01:08, 9F

06/12 01:10, , 10F
我不解 當int是2byte 是多久以前的是了
06/12 01:10, 10F

06/12 01:13, , 11F
06/12 01:13, 11F

06/12 01:17, , 12F
勿用你所謂的「常識」來誤導他人, 標準沒有明定的全都
06/12 01:17, 12F

06/12 01:17, , 13F
是未定義行為, 而你分享的code幾乎每篇都有
06/12 01:17, 13F

06/12 01:19, , 14F
參考 FDIS 3.9.1/3
06/12 01:19, 14F

06/12 01:21, , 15F
那我試圖寫成long int呢?
06/12 01:21, 15F

06/12 01:26, , 16F
還是會有endian的問題
06/12 01:26, 16F

06/12 01:33, , 17F
恩....真麻煩XD
06/12 01:33, 17F

06/12 01:35, , 18F
原PO應該知道自己是big endian or little endian XD
06/12 01:35, 18F

06/12 01:36, , 19F
實際上用union反而會比較好
06/12 01:36, 19F

06/12 01:37, , 20F
好存取 好比較
06/12 01:37, 20F

06/12 01:54, , 21F
06/12 01:54, 21F

06/12 02:02, , 22F
sizeof(long)!=4,那會dereference會有問題 @@
06/12 02:02, 22F

06/12 02:05, , 23F
話說有平台sizeof(char)是>8的..這樣的話豈不是上篇的
06/12 02:05, 23F

06/12 02:05, , 24F
fread(sum, ..也有問題 囧" 每個target有自已的ABI規範..
06/12 02:05, 24F

06/12 02:06, , 25F
對不是那麼嚴格要portable的code,沒有那麼誇張吧 @@
06/12 02:06, 25F

06/12 02:30, , 26F
其實firejox點出了一個不錯的做法,像這樣子比較小pattern
06/12 02:30, 26F

06/12 02:31, , 27F
的做法還蠻見的. 以gdb為例http://tinyurl.com/3zxkvk2
06/12 02:31, 27F

06/12 02:31, , 28F
看arm_analyze_prologue, 這是用來分析instruction用的
06/12 02:31, 28F

06/12 02:32, , 29F
就是直接用一個literal int表示一個instruction
06/12 02:32, 29F

06/12 02:34, , 30F
而讀出時用固定endian
06/12 02:34, 30F

06/12 10:30, , 31F
sizeof(char)>8 那是不合規範的
06/12 10:30, 31F

06/12 10:34, , 32F
關於sizeof(long)的問題, 在有大小假設的情況下應該用
06/12 10:34, 32F

06/12 10:36, , 33F
intN_t/uintN_t 而不是其他內建型態, 至於可攜性這就
06/12 10:36, 33F

06/12 10:37, , 34F
是制定標準的原因阿...
06/12 10:37, 34F

06/12 10:53, , 35F
我對求快而不考慮安全性不以為然
06/12 10:53, 35F

06/12 14:26, , 36F
06/12 14:26, 36F

06/12 14:27, , 37F
版主大人 您可以幫我找出我之前code哪些有錯嗎?
06/12 14:27, 37F

06/12 14:28, , 38F
我老實說 我不太清楚哪裡有問題...
06/12 14:28, 38F

06/12 15:25, , 39F
spec沒說CHAR_BIT一定要8, 事實上也存在sizeof(char)==
06/12 15:25, 39F

06/12 15:25, , 40F
sizeof(int)
06/12 15:25, 40F

06/12 15:34, , 41F
事實上,spec麼定,跟compiler的實作多少會有出入..
06/12 15:34, 41F

06/12 15:35, , 42F
比如說DSP 56300 C compiler的char與int同為4
06/12 15:35, 42F

06/12 15:35, , 43F
只抱著spec怎麼訂不管實務上如何..豈不是本未倒置
06/12 15:35, 43F

06/12 15:37, , 44F
重點是要解決問題,size/endian的問題都可以再revise
06/12 15:37, 44F

06/12 15:41, , 45F
抱歉修第一句6.5.3.4-3 sizeof(char)==1. 其他不改.XD
06/12 15:41, 45F

06/12 15:44, , 46F
我重點不在於是否該用int還是long,而單以int的問題而否定
06/12 15:44, 46F

06/12 15:45, , 47F
firejox的做法有點偏離問題的重點. fj的做法其實蠻常見的
06/12 15:45, 47F

06/12 15:46, , 48F
那段arm-gdb的實作,其實還用了unsigned int來放4B的inst
06/12 15:46, 48F

06/12 15:55, , 49F
@firejox,line4不能那樣寫,你該要寫死literal 值
06/12 15:55, 49F

06/12 15:56, , 50F
因為seq應該要static決定,但那種de-reference的寫法,其實
06/12 15:56, 50F

06/12 15:57, , 51F
要runtime才能做 (在不考慮opt的情況下)
06/12 15:57, 51F

06/12 15:59, , 52F
如果要寫死他就加個const吧 (還是我誤會了@@
06/12 15:59, 52F

06/12 16:08, , 53F
不是@@ 是int c = *(int*)"xxx" 這種, 右邊不是const
06/12 16:08, 53F

06/12 16:08, , 54F
不過要寫死literal的話,不好處理吧...
06/12 16:08, 54F

06/12 16:08, , 55F
至少gcc會error, vc可能有opt掉
06/12 16:08, 55F

06/12 16:10, , 56F
那這樣int c = *(const int*)"xxx"; ?
06/12 16:10, 56F

06/12 16:12, , 57F
是因為右邊不能de-reference的問題 @@ 其實要寫成你最初
06/12 16:12, 57F

06/12 16:13, , 58F
的0xb3010000的型式. 然後讀時固定用littel-endian去解
06/12 16:13, 58F

06/12 16:14, , 59F
你看我貼的gdb的code,那段就在做你現在想做的事..
06/12 16:14, 59F

06/12 16:19, , 60F
恩....所以說我並不需要繞那麼大圈@@
06/12 16:19, 60F

06/12 16:24, , 61F
你可以依endian定不同的seq,那讀出來可以直接比. 不然就是
06/12 16:24, 61F

06/12 16:25, , 62F
只定一種,用固定的讀法,或是不同再swap byte.兩種都有在用
06/12 16:25, 62F

06/12 16:36, , 63F
fread是big-endian 還是little-endian呀
06/12 16:36, 63F

06/12 16:36, , 64F
我認為是little-endian...
06/12 16:36, 64F

06/12 16:54, , 65F
讀raw byte無關endian. 你用int*去解讀時才有這個問題..
06/12 16:54, 65F
文章代碼(AID): #1DyvnPL3 (C_and_CPP)
文章代碼(AID): #1DyvnPL3 (C_and_CPP)