[問題] C當中資料結構與fscanf的問題

作者: GelionLin (蓋立安)   2016-09-10 16:42:28
開發平台(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
作者: Caesar08 (Caesar)   2016-09-10 17:36:00
我猜你文字檔內容跟你打的不一樣
作者: yvb   2016-09-10 17:44:00
是否有 #include <stdio.h> ? 或看一下編譯時有沒有什麼訊息?
作者: hunandy14 (Charlott.HonG)   2016-09-10 19:37:00
這好奇怪呀,跟windwos會有關呀,有差的不是編譯器差異或是版本差異嗎~win的 gcc 跟linux 的gcc 會不一樣嗎@@我有漏了些什麼嗎~純推理去想的
作者: yvb   2016-09-10 21:07:00
因為漏看了文章開頭 ==> 開發平台 VC 2013
作者: Caesar08 (Caesar)   2016-09-10 23:04:00
換compiler既然用visual studio,何不寫C++就好了?為甚麼要用C?
作者: GelionLin (蓋立安)   2016-09-26 23:05:00
VC++只是作為IDE, 目標是嵌入式平台

Links booklink

Contact Us: admin [ a t ] ucptt.com