我编写了一个简单的小程序来使用 snprintf 读取具有以下格式的文件,
skip first 15 chars , next 9 chars are sequence number, next 2 char is message and so on.
我对序列号和消息感兴趣,即从字符 16 到 26;
下面是程序。它不会读取每个字段的最后一个字符。它为序列号读取 8 个字符而不是 9 个字符,为消息读取 1 个字节而不是 2 个字节。
#include<stdio.h>
typedef struct
{
char seqno[9];
char msg[2];
}Header_T;
int main()
{
char buf[64]={'\0'};
FILE *fp;
int i = 0;
Header_T hdr1;
int skipbytes = 15;
fp=fopen("asdf", "r");
if (fp == NULL)
{
printf("FILE OPEN ERROR\n");
}
printf("--sequence--msg--\n");
while( fgets( buf, sizeof(buf), fp ) != NULL )
{
i=skipbytes;
snprintf(hdr1.seqno, 9, "%s", (buf+i));
i+=sizeof(hdr1.seqno);
snprintf(hdr1.msg, 2, "%s", (buf+i));
i=0;
printf("--%s--%s--\n", hdr1.seqno, hdr1.msg);
memset(buf, '\0', 64 );
}
fclose(fp);
return 0 ;
}
部分文件内容如下
201301082323458000000001H QB234
201301082323558000000002J QB234
201301082323658000000003N QB234
201301082323758000000004JRQB234
201301082333458000000010JSQB234
所以预期的输出是
--sequence--msg--
--000000001--H --
--000000002--J --
--000000003--N --
--000000004--JR--
--000000010--JS--
但相反,我得到的输出为
--seqno--msgtype--
--00000000--H--
--00000000--J--
--00000000--N--
--00000000--J--
--00000001--J--
谁能解释这种行为以及如何解决它?
我尝试使用for 循环逐个字符赋值而不是snprintf相同的程序,并且程序运行良好;但为此我需要为结构中的字节对齐添加一些填充符。
我也尝试过使用pragma pack()但它也没有区别。
我在 ubuntu 64 位机器上使用 gcc 4.4.3