Во-первых, давайте иметь функцию, которая читает одно поле (хотя она не обнаружит частично прочитанные поля)
int read_field(FILE *f,char *destination,size_t max_len)
{
int c;
size_t count = 0;
while(c = fgetc(f)) != EOF) {
if(c == '!' || c == '|')
break;
if(count < max_len - 1)
destination[count++] = c;
}
destination[count] = 0;
return count;
}
Затем прочитайте поля:
int ch = fgetc(fp);
if(ch=='@') {
int ok;
printf("data is valid\n");
ok = get_field(fp,input.key,sizeof input.key);
ok && get_field(fp,input.src_ip,sizeof input.src_ip);
ok && get_field(fp,input.dst_ip,sizeof input.dst_ip);
ok && get_field(fp,input.src_port,sizeof input.src_port);
ok && get_field(fp,input.dst_port,sizeof input.dst_port);
if(!ok) {
puts("parse error");
}
}