C_and_CPP 板


LINE

開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC 2013 - console 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 沒有 問題(Question): 請問一下, 我有一個結構長這樣 typedef struct { //int int_a; char char_a; char char_b; char char_c; char char_d; int int_a; }TEST_TYPE; 有一個對應的純文字檔, 內容是 1,2,3,-12345,4 利用下面的fscanf格式讀取的時候會發生int_a = -16777216 的錯誤 fscanf( opfile, "%hhu,%hhu,%hhu,%d,%hhu", &test_data.char_a, &test_data.char_b, &test_data.char_c, &test_data.int_a, &test_data.char_d ); 但是只要把結構做一些調整, 變成 typedef struct { int int_a; char char_a; char char_b; char char_c; char char_d; //int int_a; }TEST_TYPE; 就能夠正確的讀出五個值 對於struct來說, 上下兩種排列都沒有4byte alignment的問題 即便有, 也只是會有padding而已, 不致於造成格式讀取錯誤 請問這個現象是哪裡有問題呢? 餵入的資料(Input): 1,2,3,-12345,4 預期的正確結果(Expected Output): char_a = 1, char_b = 2, char_c = 3, char_d = 4 int_a = -12345 錯誤結果(Wrong Output): char_a = 1, char_b = 2, char_c = 3, char_d = 4 int_a = -16777216 程式碼(Code):(請善用置底文網頁, 記得排版) void TestFunction() { typedef struct { int int_a; char char_a; char char_b; char char_c; char char_d; //int int_a; }TEST_TYPE; TEST_TYPE test_data = {0}; FILE* opfile = 0; unsigned int index_current = 0; opfile = fopen( "test.txt", "r" ); fscanf( opfile, "%hhu,%hhu,%hhu,%d,%hhu", &test_data.char_a, &test_data.char_b, &test_data.char_c, &test_data.int_a, &test_data.char_d ); fclose(opfile); } 補充說明(Supplement): 感謝~~ update--- 問題應該是因為Windows下不支援C99中hh的prefix 所以hhu會解讀成hu 在fscanf 的時候用了h的short而不是hh的char 把後面那個byte 也抓進來造成錯誤 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.163.87.77
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1473496950.A.E2D.html
1F:→ Caesar08: 我猜你文字檔內容跟你打的不一樣09/10 17:36
2F:推 yvb: 是否有 #include <stdio.h> ? 或看一下編譯時有沒有什麼訊息?09/10 17:44
感謝回應 我把解答放上來嘍~~ ※ 編輯: GelionLin (1.164.126.82), 09/10/2016 18:45:15
3F:→ hunandy14: 這好奇怪呀,跟windwos會有關呀,有差的不是 09/10 19:37
4F:→ hunandy14: 編譯器差異或是版本差異嗎~ 09/10 19:37
5F:→ hunandy14: win的 gcc 跟linux 的gcc 會不一樣嗎@@ 09/10 19:38
6F:→ hunandy14: 我有漏了些什麼嗎~純推理去想的 09/10 19:39
7F:推 yvb: 因為漏看了文章開頭 ==> 開發平台 VC 2013 09/10 21:07
恩...是VC的問題 btw 補充一下這邊有一個列表 http://www.cplusplus.com/reference/cstdio/fscanf/ specifiers 那邊有說明 Note: Yellow rows indicate specifiers and sub-specifiers introduced by C99. 對於VC上的這個問題 目前的解法是用short/int去接 之後再自己cast到char/unsigned char 不知道大家有沒有更好的解法? ※ 編輯: GelionLin (1.164.126.82), 09/10/2016 22:50:14
8F:→ Caesar08: 換compiler 09/10 23:04
9F:→ Caesar08: 既然用visual studio,何不寫C++就好了?為甚麼要用C? 09/10 23:05
10F:→ GelionLin: VC++只是作為IDE, 目標是嵌入式平台 09/26 23:05







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP