Я написал простую небольшую программу для чтения файла в следующем формате, используя 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--
Может ли кто-нибудь объяснить это поведение и как его исправить?
Вместо snprintf я попробовал ту же программу, используя посимвольное назначение цикла for, и программа работает нормально; но для этого мне нужно добавить некоторые наполнители для выравнивания байтов в структуре.
Я также пытался использовать pragma pack(), но это также не имеет значения.
Я использую gcc 4.4.3 на 64-битной машине Ubuntu.