アトリエミュート、開発担当、けいしと申します。
『効率』を重視するのであれば、char の動的配列を作成して、バイナリで書き込むのが良いかと思います。
たとえば、書き込む文字列が
char str[]
とあった場合、
int len = strlen(str) + 1;
char* buff = (char*)malloc(sizeof(int) * 数値データの個数 + sizeof(char) * len);
char* p = buff;
*((int*)p) = 数値1; p += sizeof(int);
*((int*)p) = 数値2; p += sizeof(int);
*((int*)p) = 数値3; p += sizeof(int);
...
*((int*)p) = 数値n; p += sizeof(int);
strcpy(p, str);
これで、buffは必要最小限のメモリを確保していることになりますし、
頭から順番に、数値が無駄なく入り、続いて文字列も無駄なく入っていることになります。
どうでしょうか。