作者GelionLin (盖立安)
看板C_and_CPP
标题[问题] C当中资料结构与fscanf的问题
时间Sat Sep 10 16:42:28 2016
开发平台(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/cn.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