================stdafx.h======================== // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h> // TODO: reference additional headers your program requires here #include <stdlib.h> ================1.cpp ======================== // 1.cpp : visual stduio 2010 beta2 VC10 // #include "stdafx.h" #ifndef DEBUG #define DEBUG 1 #endif // http://zhidao.baidu.com/question/135901012.html struct T_X{ char name[16]; int value; }; typedef struct T_X * PT_X; //"PT_X" === "struct T_X *" //for C syntax //must use "struct T_X", no use "T_X" alone //void swap(int &a, int &b) //only for C++ syntax void swap_TXp(struct T_X **a, PT_X *b) //prefix struct everywhere { PT_X c = *a; *a = *b; *b = c; return; } int _tmain(int argc, _TCHAR* argv[]) { // return 0; //} // //int main(int argc, char *argv[]) //{ FILE *fp; #if DEBUG if ((fp = fopen("data.txt", "r")) == NULL) //open file { printf("can`t open %s/n", argv[1]); return 1; } #else if (argc != 2) //require a filename as command line arg, first one and the only one { printf("missing file argument"); return 1; } if ((fp = fopen(argv[1], "r")) == NULL) //open file { printf("can`t open %s/n", argv[1]); return 1; } #endif const int RECORD_COUNT = 20; size_t memsize1 = (sizeof(struct T_X)) * RECORD_COUNT; size_t memsize2 = (sizeof(struct T_X*)) * RECORD_COUNT; void *tempp = malloc(memsize1 + memsize2); struct T_X *xs = (struct T_X *)tempp; //alloc memblock1 struct T_X **xps = (struct T_X **) (xs + RECORD_COUNT); //alloc memblock2, techinal demo for how to use a pointer to pointer for (int i = 0; i < RECORD_COUNT; i++) //read records { fscanf(fp, "%s %d", &(xs[i].name), &(xs[i].value)); //fgets(&(xs[i].name), 9, fp); //read field name //char temps[3]; //fgets(temps, 3, fp); //read field value //xs[i].value = atoi(temps); xps[i] = &xs[i]; //init pointers } //take a bubble sorting, smallest one moves to array[0] if (RECORD_COUNT <= 1) { } else { for (int i = 0; i < RECORD_COUNT - 1; i++) { for (int k = i + 1; k < RECORD_COUNT; k++) { if (xps[i]->value > xps[k]->value) { swap_TXp(&xps[i], &xps[k]); } } } } fclose(fp); for (int i = 0; i < RECORD_COUNT; i++) { printf("%s/t%d/n", &(xps[i]->name), xps[i]->value); } getchar(); return 0; } /*===========data.txt============= Takahasi 60 Ojima 30 kojima 10 Miura 12 Suzuki 60 Kato 70 Kudou 40 Kameda 44 Akiyama 80 Kuno 10 Sato 50 Suda 65 Nakamura 95 Kimura 85 Matumoto 70 Yamada 33 Saitou 95 Hayashi 66 Kawasaki 40 Nagai 35 ===========screen output============= kojima 10 Kuno 10 Miura 12 Ojima 30 Yamada 33 Nagai 35 Kawasaki 40 Kudou 40 Kameda 44 Sato 50 Suzuki 60 Takahasi 60 Suda 65 Hayashi 66 Kato 70 Matumoto 70 Akiyama 80 Kimura 85 Saitou 95 Nakamura 95 */