缺点:
1,没有限制输入位数
2,ReadData函数以及控制输出函数返回值为指针,这个并不安全
改进方法:
1,把学号类型改为字符串类型,利用conio.h和getch()函数可以进行判断读取,详细可参考orderdish点餐系统
2,把返回值为指针的函数该为void Funtion (pointer * pOutput)的形式,把对指针的操作改为传递指针值进行函数内部操作。
#include
#include
#include
#include
#include
#include
#include
#define MAX_LEN 50
#define STLEN sizeof(STSI)
int WhereX()
{
CONSOLE_SCREEN_BUFFER_INFO pBuffer;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &pBuffer);
return (pBuffer.dwCursorPosition.X+1);
}
int WhereY()
{
CONSOLE_SCREEN_BUFFER_INFO pBuffer;
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &pBuffer);
return (pBuffer.dwCursorPosition.Y+1);
}
void gotoxy(int x,int y)
{
COORD c;
c.X=x-1;
c.Y=y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
typedef struct tagSTSI
{
int nStuNo;
char szName[MAX_LEN+1];
int nAge;
float fGPA;
float fTuition;
struct tagSTSI * pNext;
}STSI;
char gszFilename[30] = "student.dat";
STSI * ReadData(void)
{
int n;
STSI * pHead = NULL;
STSI * pPrev;
STSI * pCurrent;
FILE * pFile;
if ((pFile = fopen(gszFilename,"ab")) == NULL)
{
puts("创建文档出错");
exit(EXIT_FAILURE);
}
rewind(pFile);
fclose(pFile);
if ((pFile = fopen(gszFilename,"r+b")) == NULL)
{
puts("打开文档出错");
exit(EXIT_FAILURE);
}
while (!feof(pFile))
{
if (fscanf(pFile,"%d",&n) != EOF)
{
if ((pCurrent = (STSI *) malloc(STLEN)) == NULL)
{
puts("内存申请出错");
fclose(pFile);
exit(EXIT_FAILURE);
}
if (fread(pCurrent,STLEN,1,pFile) != 1)
{
puts("文件读取出错");
free(pCurrent);
exit(EXIT_FAILURE);
}
if (pHead == NULL)
{
pHead = pPrev = pCurrent;
}
else
{
pPrev->pNext = pCurrent;
pPrev = pCurrent;
}
}
else
{
break;
}
}
fclose(pFile);
//puts("文件读取成功");
return pHead;
}
STSI * CreatNode(int nCN)
{
int nCount;
size_t nJudge;
int nX,nY;
STSI * pHead;
STSI * pPrev;
STSI * pCurrent;
STSI * pSTF;
pSTF = ReadData();
for (nCount = 0; nCount < nCN; nCount++)
{
pCurrent = (STSI *) malloc(STLEN);
puts("请输入学号,返回请输入0");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&(pCurrent->nStuNo));
system("cls");
if ( pCurrent->nStuNo == 0)
{
return NULL;
}
while (pSTF != NULL)
{
while (pSTF->nStuNo == pCurrent->nStuNo)
{
printf("学号重复,请在下一行重新输入新的学号,返回请输入0\n");
nX = WhereX();
nY = WhereY();
gotoxy(nX,nY);
scanf("%d",&(pCurrent->nStuNo));
if ( pCurrent->nStuNo == 0)
{
return NULL;
}
system("cls");
}
pSTF = pSTF->pNext;
}
puts("请输入名字,返回请输入0");
nX = WhereX();