#include <string.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX_NAMES 6

typedef struct {char num[2]; char _space[1]; char name[MAX_NAMES]; char lfcr[2];} TXTBUF;
typedef struct {int num; char name[MAX_NAMES + 1];} Meibo;

#define Val(s) _Val((s), sizeof(s))
static int _Val(const char * s, int l) {
  char buf[128]/* かなり適当 */; memcpy(buf, s, l); buf[l] = '\0'; return (atoi(buf));
}

int compare(const void *y, const void *x) {
  Meibo* m1 = (Meibo*)y; Meibo* m2 = (Meibo*)x; return m1->num < m2->num;
}

void main() {
//ファイルオープンもリードも成功するものとして、エラーチェックは無視しました。
  Meibo meibo[15]; TXTBUF txtbuf;
  FILE* fp;
  int i, n;

  fp = fopen("名簿.txt", "r");
  n = (int)(filelength(fileno(fp)) / sizeof(TXTBUF));
  for (i = 0; i < n; i++) {
    fseek(fp, (long)sizeof(TXTBUF) * i, SEEK_SET);
    fread(&txtbuf, sizeof(char), sizeof(TXTBUF), fp);
    meibo[i].num = Val(txtbuf.num);
    memcpy(meibo[i].name, txtbuf.name, MAX_NAMES);
    meibo[i].name[MAX_NAMES] = '\0';
  }
  fclose(fp);

  printf("ソート前\n");
  for(i = 0; i < n; i++)
    printf("%02d - %s\n", meibo[i].num, meibo[i].name);

  qsort((void*)meibo, n, sizeof(Meibo), compare);

  printf("ソート後\n");
  for(i = 0; i < n; i++)
    printf("%02d - %s\n", meibo[i].num, meibo[i].name);
}
言葉で説明するのムズイ・・・ソースで勘弁してください