我是大帅哥,擅长LINUX和C语言,还有脚本,希望和大家交朋友 QQ:21488275 MSN:chenkuo2006@hotmail.com

《学生管理系统》C源代码(待续)

2008-01-07 00:10:57 / 精华(1) / 置顶(3) / 个人分类:C语言编程

一个作业题,最近在出差,没有做全,剩下排序和修改,修改部份好弄,排序还要想一个高效的办法。LUPA开源社区K(_ ^+p Mn+`h
注释只有insert.c有注释,其余还没有写完。有空再补。是在LINUX下编写,编译的,设计思想也主要是LINUX风格,所有弄得相对复杂。有空再画一个流程图什么的.比较符合刚接触LINUX的菜鸟看.
/tq,tm,_TZ'n,zcT0LUPA开源社区 Gg5e RF!uuZh,?

e2g]0X)Y8HPjp8o0文件如下:LUPA开源社区5V\Id^@
main.h(头文件)
kK$AK],A|)r0main.c(主函数及菜单)
!^O-wR3Q0insert.c(新增数据)LUPA开源社区~E4F+Q2~S I$~7] zz
delete.c(删除数据)LUPA开源社区7vcl![ WfT%W c
find.c(查找数据)LUPA开源社区#f;T S{^2\ Za E,i'c
show.c(显示输出数据)
rB~ N1@;A [&uJRc5p0LUPA开源社区 j!jAg;F3c
原题如下(网上比如常见):
l#L)UBg5l,r9M0试设计一学生信息管理系统,使之能提供以下功能:
?[O$Y/y01、系统以菜单方式工作LUPA开源社区2{3@UIA7O&j
2、学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。
OA1M p)R)y03、学生信息录入功能(学生信息用文件保存)---输入
H [r9h(I04、学生信息浏览功能---输出
-o\7cud^+\05、查询、排序功能---算法LUPA开源社区3X u$Q.T3Ovq!d*@n$|
6、学生信息的删除与修改(可选项)
k1P g^3FI0
fk+b&q)GQn0原代码如下:
?5b,T.G/P0/////////////////////////////////////////////////////LUPA开源社区v3x"g:iMY&R
//main.h
1u\\$U&c2W+|0/////////////////////////////////////////////////////
P;_1tjFo0# define STUD_FILE         "/tmp/student.txt"LUPA开源社区A3aGt4I,`7~!p'U y
# define INDE_FILE         "/tmp/inode.txt"LUPA开源社区-g'A$fKM2}[3o+a
# define SORT_FILE         "/tmp/sort.txt"
DA;{B Z3F.y0# define FILE_OPEN_APPEND  O_CREAT|O_RDWR|O_APPENDLUPA开源社区7t}#Hc+iX/i4_Zo
# define FILE_OPEN_RW      O_CREAT|O_RDWR
6W@1d&Zs%L3v*J0# define FILE_OPER_LIMIT   00644LUPA开源社区 s n1Vty ev
# define NULLUT            ((struct stud *)NULL)
iK Y$m L3U Yf0# define NULLINODE         ((struct sinode *)NULL)LUPA开源社区_v ~ L4el9|!Q q
# define NULLSORT          ((struct sortinode*)NULL)LUPA开源社区&q2s.Gx vOeC
# define STSIZE            sizeof(struct stud)
d,y#H,d6g0# define NRECS             16LUPA开源社区 X*Z{2yy'V
# define INODE_SIZE        sizeof(struct sinode)
.k#Qs-m%_c0# define SORT_SIZE         sizeof(struct sortinode)LUPA开源社区K3@Y'gz'W
# define INODE_IS_NULL     "0"LUPA开源社区"f;Q0C7OM{3xV{
# define INODE_NO_NULL     "1"LUPA开源社区i'] tW!B!kUp'E
# define ACTIVE            "ACTIVE"LUPA开源社区u L[}h
# define DELETE            "DELETE"LUPA开源社区7?C7vW9m~3m

+Y*r.QBt5j+V0
m7V[z@CT0# define CODE_ERROR        -10LUPA开源社区0u@8D:?Aj
# define NAME_ERROR        -11
6l0n}2}:w-[,M0# define AGE_ERROR         -12
1\qfQE8V6kXd5g4?0# define SEX_ERROR         -13LUPA开源社区a u|{U
# define DATE_ERROR        -14LUPA开源社区%dU,`#AR4]n
# define ADDRESS_ERROR     -15LUPA开源社区bp(J;wRn
# define TELEPHONE_ERROR   -16LUPA开源社区A x&j0{#?S_7F
# define EMAIL_ERROR       -17
yi kR;PY&O0
q+o l$ou0# define INPUT_ERROR       -20
K2H,b;Y%k'U ]8o^{0# define OPEN_FILE_ERROR   -21
$n%rL)}3O\i ^0# define WRITE_FILE_ERROR  -22LUPA开源社区?5}w?;I,WR!YD
# define MENU_INPUT_ERROR  -23
$?aR5M6}b6g%J0LUPA开源社区 RZjx%H&u.Ad.L
LUPA开源社区 t.?9SYc9bM"U
# define SUCCESS           0LUPA开源社区.AO;U$yh9M"{
# define FAILURE           1
CM}v'k e9Z^0LUPA开源社区(d$mm\%Vq-X

bYj6GP UDAU0
9N Jf]8wD0struct stud
E g"oM#m.E|/]X0{
4JM5kV^:rg BP%GuF0    char code[8];
6X(Q/M0aDx)@0d0    char name[20];LUPA开源社区lngJ_JY Y `
    char age[4];
`;NF#G A!O*e'|0    char sex[2];
!Wm(BY,|0    char date[11];
NDA(Gq Q'i0    char address[30];LUPA开源社区I OR o D7V
    char telephone[24];
oz`}dcO X.Dp~0    char email[30];LUPA开源社区;H8};Tb+d
    char flag[2];
2p(ry/JM5g `0    char enter;LUPA开源社区8n T|JTq a%^
}stud_info;
j7b o1r4W.T6I:~Q0
pQC0c9}6`QL$@0LUPA开源社区v-O&BBw5n/e;A
struct sinode
x0II/Jv?0{
%Hnw%~/U AG^0    char flag[2];LUPA开源社区+[G rZ%z;j"x
    char code[8];LUPA开源社区)QY#P!A)S(X h }
    char addr[20];
R:H4kVvZ0    char enter;
G ^?H I(|0}sinode_info;
iGcJ f0X5e0LUPA开源社区lcr{-W I!dj b
LUPA开源社区?ET#k4og4c8?1~VI
struct sortinodeLUPA开源社区JB/q)HF,~uz
{
h L!L.Dj0s{X#q;m0    char flag[2];LUPA开源社区:mr6RK~
    char name[20];LUPA开源社区{6rm#M*L8tZ)LT
    char addr[20];
GQw%w`0    char enter;LUPA开源社区Vo k4]TR(o\T
}sort_info;LUPA开源社区,Z0K*BK4Q

&^Z,v _q M4u0G)~0LUPA开源社区y$Z(|'|:UF D3J
extern int  fd_stud;LUPA开源社区z7O}`-d$t2N%X&kO
extern int  fd_indx;LUPA开源社区~U KOGY u!]-z+Z
extern int  fd_sort;
1J9o9sS)H0extern char segregation;
cZp.U5CQ4m0extern char enter;LUPA开源社区'FV5s)J3HV;}w
extern int  cur_rec;
T}A P!vM*g~;a0extern int  num_recs;
Ya%N T/LY j0LUPA开源社区\ z7a)Kau&a{2X"l
LUPA开源社区xN)e~_T]F
LUPA开源社区6wyp@od0S4v
extern void               input(void);LUPA开源社区z1sjbIG
extern void               show(void);LUPA开源社区},D#a(RjP
extern void               find(void);
K H Q,e [#N0extern void               delete(void);LUPA开源社区*D a3M {)w/}
extern void               sort(void);
[^)a;@vuY0extern void               update(void);LUPA开源社区!{DT+_o A
extern void               quit(void);
1gWF,A3HK0extern void               error(int);LUPA开源社区"j8H|/_ y
extern void               dump_line(char *);LUPA开源社区eW7B d3dv"x"kt;L
extern void               repeat_input(void);
3I4Ch8Y/vX2D0extern int                write_stud(struct stud *);LUPA开源社区W,_m)wq-o:u
extern void               max_show_title(void);LUPA开源社区&\y"On\
extern void               min_show_title(void);LUPA开源社区oe;k(Pjd`ca
extern void               min_show_data(struct stud *stbuf);
K3Gd3Pwt|7P.T(n0extern void               max_show_data(struct stud *stbuf);LUPA开源社区s9m}:S4?V4Q
extern struct stud       *stud_next(void);LUPA开源社区V"v!W-u v/M_
extern int                stud_reload(void);
P;QW{m:X0extern struct sinode     *sinode_next(void);
p;l1Q_Gz0extern int                sinode_reload(void);LUPA开源社区#F E'L7`F2kb
extern int                ins_inode(int long, char *, char *);
h2Gw^0on7[:XZ0extern struct sortinode  *sort_inode_next(void);LUPA开源社区1n7KZ+Ph.o^8M2k m-Xi
extern int                sort_inode_reload(void);LUPA开源社区:UP"N3mNI | p(s
LUPA开源社区d(V0{i {.P~
//////////////////////////////////////////////LUPA开源社区7TE5?AS?qq
//main.cLUPA开源社区E+uwoYT$eY v
//////////////////////////////////////////////
3q)@#|6XU2i0LUPA开源社区7sJb"AF S)JNQ b
# include <stdio.h>
nGf)b/T7{k;P#_0# include <stdlib.h>LUPA开源社区z/NW4Aii~2x
# include <fcntl.h>
Jzr-QE%|%B Eo0# include <unistd.h>
7s i4DBP}6F0# include <sys/stat.h>
3H*g'lRhEs0# include <string.h>
6d,x!k:T-vt+tX'o$Q5R0# include <termios.h>
K8H%~#h4v{ZT0# include "main.h"
y7O Xv r+_ aor0
;K*A-U R!JQfp0LUPA开源社区l4o0VCe
static void menu_show(void);LUPA开源社区mRDGBIL/^pKu6J
LUPA开源社区)b(@a6?@!x-B9j _
int fd_stud = 1;
1]}H2~jZ-P'^/E0char segregation = '\t';LUPA开源社区{a G[&O5K7?x
char enter = '\n';LUPA开源社区$o"t"VF R+DL(A8f

S6CyQ%`1r#?0LUPA开源社区6}/R}U&xo

5Ht-R$cz^ rc@ h0extern void error(int flag)
.h"~%}9x2F0{
P`sH;e6v0    switch(flag)LUPA开源社区.Zbpu$k `T)VJ
    {LUPA开源社区 chVG9X^4E
        case INPUT_ERROR:     {printf("Input error,repeat input info!\n");
/LVM6Dr0                               printf("Press ENTER continue......\n");
c(d1A&Rr5\}Y^*L0                               getchar();LUPA开源社区Z?N CLC
                               break;}
u7qg+f#Ywk0LUPA开源社区5t9m(k@i)wG-Qu
        case OPEN_FILE_ERROR: {perror(STUD_FILE);
![({({9~'l$Y`0                               exit(EXIT_FAILURE);}
SI Ee/KX0
%rfZ-e"?)Wh6x0        case WRITE_FILE_ERROR:{printf("Write file %s failed!",STUD_FILE);LUPA开源社区,z,e@*n)MN x[
                               perror(STUD_FILE);LUPA开源社区Ke-KDE
                               exit(EXIT_FAILURE);}
U~ H'd1~ }!V0
3|6d9\ps6fvE_ z~0        case MENU_INPUT_ERROR:{printf("Please,choose number(1-7)\n");
G@,dm ?^(PL }:}3r0                               printf("Enter any button continue.......\n");LUPA开源社区b"R&z#\ }W2K
                               getchar();getchar();break;}LUPA开源社区#KA4ml)R-{&^y,r
    }
E!z(Z;xd{S0}
^!}-PT h5vFj0LUPA开源社区UZlD9b6l'K

3`J Uwq E?$U0
5a7l[3PKx#b}!l D f0extern void sort()
c0K7X zWEK4M0{}LUPA开源社区 H ~o e:E2n8o
LUPA开源社区C-p(A xN4Sf
extern void update()
WAkf[ f(N0{}
"Mz/A6x9S3gw/Ln0
%n'otwLi%f ?0extern void quit()
9}OP*fe `6v)KL0{
4S6[8\m.p$Oj0    system("clear");
n4^C rl(c0    printf("success exit!\n");
O(m/~S7F Tr9hR#ZJ0    printf("Good bye!\n");LUPA开源社区"\(ESIu#z'yI
    exit(EXIT_SUCCESS);
1@\1}X%f nYG} d0}
e:X4S Z\Lk'SS f0LUPA开源社区WRGd8x7[m'|
LUPA开源社区-?;}.hLaRKf
int
4o;i m/kWQl9~f0main (void)LUPA开源社区0T[4[:T r/} [
{LUPA开源社区T+[7VP'J(x@6l-~$ol
    char *choose_item;LUPA开源社区E(^f#tTA1g @3C P G/z
    choose_item = (char *)malloc(8);LUPA开源社区I;o3k*sQ

e+oP ALu:~:i0    while(1)
lL5Qcn*{"`0    {
9aiH@S7wG \0      menu_show();
B8ph e)oWw F0      printf("Choose:");
ARz!n4H2~0|%jO}0      scanf("%s", choose_item);LUPA开源社区'b(GWH3]$s5w
      if(strlen(choose_item) >= 2)
9})E"@jH m]}6q0          {puts("error!\n");LUPA开源社区yb3w9T\ v"QZ
           *choose_item = INPUT_ERROR;}
c2V2@K z0      elseLUPA开源社区DFd3|'q3y
      {dump_line(choose_item);}LUPA开源社区gM`2G~p[
      switch(*choose_item)
I~:`[\4Q9oG6|o0      {LUPA开源社区1^w+\2fj ~0M2}5X Ck
        case '1':  input();                 break;LUPA开源社区_4C3r]3eF)gW0\&T{
        case '2':  show();                  break;LUPA开源社区X @%e4G1| eEi6Wl
        case '3':  find();                  break;
2c*G,MX Ul$h"E8\o0        case '4':  delete();                break;
u+w:`b{0        case '5':  sort();                  break;LUPA开源社区],LC6Q4D%X-B
        case '6':  update();                break;
}6F.egF0        case '7':  quit();                  break;LUPA开源社区r[3FW2x v
        default: error(MENU_INPUT_ERROR); break;LUPA开源社区-R7@Hm9x1q ~
      }
f%\ ofx1y0    }
!G8Ttq~8}VPh0    exit(EXIT_SUCCESS);LUPA开源社区f2K(SB(Hd;\
}
;h @"BEalc:h"x&[A0LUPA开源社区+C*A9o/C:~+LE
LUPA开源社区0A8Su]C,b
static void menu_show(void)
g|O)N2irU0{
g P E/c1~ }9W0    char space[25]="                        ";LUPA开源社区/|"k| SO4B(cw
    system("clear");LUPA开源社区_cJcX+SA+N4I P
    printf("\n");
:y)smOW e Dto|8g'Jqi0    printf("%s*****************************\n",space);
? }J0JA V%I,P%UV X0    printf("%s*    STUDENT INFO SYSTEM    *\n",space);
;Ts8i.f8T,B2C]0    printf("%s*    1)input  information   *\n",space);
5T{R\6nF0    printf("%s*    2)show   information   *\n",space);
.t\/xI+K3\7o'G0    printf("%s*    3)find   information   *\n",space);
4MyPkc$u D0    printf("%s*    4)delete information   *\n",space);
2itC!S a'@1|0    printf("%s*    5)sort   information   *\n",space);
5U#\!Fk)@W0    printf("%s*    6)update information   *\n",space);
d`~ ENI$}:Z1K*UMe7M m0    printf("%s*    7)exit   THE END       *\n",space);
k}$X1n/Tk7w{Z0    printf("%s*****************************\n",space);
"ceE.YH,T0    printf("\n");LUPA开源社区^;F6Hm!\F
}
8_7a6|xX;T!g dL$W0LUPA开源社区:p*DPbA qt\4s

k/j i}1[#t0/////////////////////////////////////////
v"u.}!}ii+r0//insert.cLUPA开源社区 p&x7Dr,I u!t
/////////////////////////////////////////
8? [u7O;k_T|0# include <stdio.h>LUPA开源社区*ppC4y7]2h%ippz
# include <stdlib.h>LUPA开源社区6f5C0S!ERb
# include <fcntl.h>LUPA开源社区rT9v7d.@(d|
# include <unistd.h>LUPA开源社区q.?3])O)Mry,U
# include <sys/stat.h>
WQ9R8ed0# include <string.h>
lu4aKk;?Y&t D0# include <termios.h>LUPA开源社区 h5Z/{/L"pE+l l u
# include "main.h"
j|f6[6|'Z-n*nW0LUPA开源社区 ~ R|^E
LUPA开源社区l4Gg MQ*wD O
/* 程序流程:
$f@ b6e&i.Gci0 * 1)执行input函数,输入用户信息,检查信息合法,并去掉多余字符,最后调用write_stud函数LUPA开源社区e.}/pDv
 * 2)执行write_stud函数,调用ins_inode函数
.kq m,J|9c Y2H0 * 3)执行ins_inode函数,将输入用户信息,写入CODE索引文件与NAME索引文件中
%b;BS yYg5Ym0 * 4)返回write_stud函数,写入用户信息到数据文件中*/LUPA开源社区!j ?5h!d j \qR*My
LUPA开源社区Q;u gc7E(y
/* 未完成功能:LUPA开源社区~YI0H9D_oc
 * 不能检测各字段为空,即输入为空,也认为合法
zq5eJ\"`"cPYY0 * 日期检测不能达到日常表达的要求格式*/
ZF3E l anU0LUPA开源社区 N ?uk`
/* 定义CODE索引列表中CODE字段的长度*/
6I)Prh(JO7B0/* 定义NAME索引列表中NAME字段的长度*/LUPA开源社区%Fm#u@'c4H`
LUPA开源社区_$uyu5S
# define  CODE_LEN   8
r,S!uIwv m \h0# define  NAME_LEN   20LUPA开源社区:eU1XhB6e(qAl
LUPA开源社区%dR7? {Vw3O&w.]

%y*Sq_2P.Zq-w0
'E{ a I-JcKf0/* 定义结构体指针变量*indebuf,用于存放CODE索引列表*/
hd m&S"W0/* 定义结构体指针变量*sortbuf,用于存放NAME索引列表*/LUPA开源社区8gI'v1YV n1_y
LUPA开源社区~/t%}p`P!l
struct sinode    *indebuf;
:P;q+~7OX"V A a5NE a)H0struct sortinode *sortbuf;LUPA开源社区^;bM;OUZ:G&k

0EalJ2]2F6W4@0LUPA开源社区ni(w)_&\ e+L
/* 定义cur_rec,用于*sinode_next(void)函数,作用为循环计数*/LUPA开源社区z+V:X%WK-Z"J8Urj/ZY
/* 定义num_recs,用于*sinode_next(void)函数,作用为一次读取总记录数*/LUPA开源社区` V d4~4{TP

5Y ~ y&T AR0int            cur_rec;
f3rc9{-J:jP X0int            num_recs;
kTX/u+Q!K0LUPA开源社区\9x9c|1RX6S
LUPA开源社区uS3f/]![.Iox
/* 定义fd_indx,用于存放CODE索引文件的文件描述符*/LUPA开源社区0N9eR{1n@[
/* 定义fd_sort,用于存放NAME索引文件的文件描述符*/LUPA开源社区5ogVLl H5Z8D

A'P{*@ z;P;jG6g P0v0int            fd_indx = -1;LUPA开源社区3^,t0]&c)U$N9Y!f4L
int            fd_sort = -1;
d,R M$Y1~&s\[0LUPA开源社区r:sW'xced

"GK)xbHzT#]4`H0cV0
8U({*D;N4YT6iV0/* 函数dump_lineLUPA开源社区LW%T|o*E p
 * 传递参数:形参*stud_infoLUPA开源社区arO(U2T.J0Il|
 * 作用:去掉输入中超出规定的多余字符LUPA开源社区j#pWD2Z-z$_q9_.o
 * 无返回值*/
-N~$@m }M C!N0
fO#D'P t!Z0extern void dump_line(char *stud_info)LUPA开源社区,|x+z&f@]0kN[
{LUPA开源社区 XH6oejmc6E|
    register int ch;
L"loz {0    char *stud_addr;LUPA开源社区2U7vyQ6qN

9X?*A.Tj(@m0
0k)wlX%T0    /* strchr查找是否有回车符,如果有回车符,返回回车符在字符串中的位置
6`7g] d'?e0     * 用'\0'取带,以保证在写入到文件中,是没有回车符的,
4_$wp3e.F8\N xc0     * 如strchr没有查到回车符,则认为用户输入了过多的字符LUPA开源社区"w6ja4y PL
     * 通过循环调用getchar()吃掉多余字符*/
,B:BY5p.K%W5G0q0
? F X2vF"i2xe0    if ((stud_addr = strchr(stud_info, '\n')) == 0)
,w q,[nN^ D1[/a0    {
` D@-Op0        while((ch = getchar()) != EOF && ch != '\n')LUPA开源社区 i!G*IG1WL/s
        ;LUPA开源社区] i t?t2~1E
    }LUPA开源社区*R5q$V&b"WqT5~~
    elseLUPA开源社区 zGPE)J-O9l%}E5QRH
    {LUPA开源社区0dqiL {E H
        *stud_addr = '\0';
S4{r3\)XN0    }
Q2Hx(]vUHT t!M4\0LUPA开源社区z$nsM+|C*u P(y#F
LUPA开源社区d5C6`1}"^4x
}LUPA开源社区 @:s/c?-z W1j

~A@9rB tVL0
#l(K!b)p1]TuFS,{0/* 函数check_line
^ SZ8GAb0 * 传递参数:形参*stud_infoLUPA开源社区9f;Ts U B4G|
 * 作用:检查用户输入的信息
"IR2@*DHZer9}0 * 返回值:返回输入中各种类型的错误状态LUPA开源社区e zQ{B [
 */LUPA开源社区 h` I_-?ydA7vW d
extern int check_line(struct stud *stud_info)LUPA开源社区0Uk Js2bOu
{LUPA开源社区5A2R&bK5tM'^
    const int stud_code_len      = strlen(stud_info->code);
C,U+HLN U7z:P4g0    const int stud_name_len      = strlen(stud_info->name);LUPA开源社区 ?)}q [5m5o0N
    const int stud_age_len       = strlen(stud_info->age);LUPA开源社区r Sp"~5N\O*|SL `o
    const int stud_sex_len       = strlen(stud_info->sex);
]J1]w J7yj)`R0    const int stud_date_len      = strlen(stud_info->date);
w5Q+o[wk!l S0NZ;|0    const int stud_address_len   = strlen(stud_info->address);LUPA开源社区 T8vS1W E'U S
    const int stud_telephone_len = strlen(stud_info->telephone);LUPA开源社区 `2u"X a_"I
    const int stud_email_len     = strlen(stud_info->email);
(u7x9\ROj0
u-hBO"~ A%z Ou/W0    register int i;LUPA开源社区%wg&m4GqC

fR?8uw+Y@e(l i.E~0    /*学号只能为0-9数字*/
DoCgZNu%h0    for (i=0; i<stud_code_len; i++)LUPA开源社区 |c._%}tVA
      if(*(stud_info->code+i) < '0' || *(stud_info->code+i) > '9')
)ck T-cm$j H!|.^%}7f0        return CODE_ERROR;
[+W ~T,](Z0
r.F!c(?V;]9g$h0    /*用户名只能为大小写字母及.符号*/LUPA开源社区QK"n^%P6O4J
    for (i=0; i<stud_name_len; i++)
M6^Q/w6Q-HI I0      if((*(stud_info->name+i) < 'a' || *(stud_info->name+i) > 'z')LUPA开源社区(M8};x!J,|]$d8e V
        && (*(stud_info->name+i) < 'A' || *(stud_info->name+i) > 'Z')
}V6f1Z9gNg!?9^ v0        && (*(stud_info->name+i) != '.'))
F`/o N5popJ8ek+Tp0        return NAME_ERROR;
;Z.JBXVe:Q0LUPA开源社区j$D)aVKp(T]7?
    /*年龄只能为0-9数字*/
|7f7W'_zCqI+I,E0    for (i=0; i<stud_age_len; i++)LUPA开源社区#x{3` go7H;H Gp\
      if((*(stud_info->age+i) < '0' || *(stud_info->age+i) > '9'))LUPA开源社区 jg}-n@9l(h+s!e
        return AGE_ERROR;
-Lz5h wZ3aML0LUPA开源社区8x$u Y/v]gdt
    /*性别只能为F/f(男)或M/m(女)*/
7|%ZO7n/l}6[u0    for (i=0; i<stud_sex_len; i++)
j3IX X3S0      if(((*(stud_info->sex+i) != 'F' && *(stud_info->sex+i) != 'M')LUPA开源社区1C fwd1[
         &&(*(stud_info->sex+i) != 'f' && *(stud_info->sex+i) != 'm')))
v l%gW+{.aF/Xh0        return SEX_ERROR;LUPA开源社区0x#N-c6u.O$Ly
LUPA开源社区 L:f)Zb"H/s z6a Z og
    /*日期可为所有字符*/
7p"|m+N2q.zV0    /*for (i=0; i<stud_date_len; i++)
z"{T;FO T0      if(*(stud_info->date+i) == '\0')LUPA开源社区kq[3WvQ#V+R V
        return DATE_ERROR;*/
-K}'eM.s:z8_y0LUPA开源社区 F;l(zR4[d Sl5F!B
    /*地址可为所有字符*/
L4UG,eW,aT0    /*for (i=0; i<stud_address_len; i++)
/Wy8UzA"~q0      if(*(stud_info->address+i) == '\0')LUPA开源社区D^l,aa:j9P]
        return ADDRESS_ERROR;*/LUPA开源社区0[we#n pb&{P2v
LUPA开源社区eO#P4e V {FD;m2h
    /*电话只能为0-9数字*/
Zyf+R Gx#aFo2D0    for (i=0; i<stud_telephone_len; i++)
m {6Z2B7U\0      if((*(stud_info->telephone+i) < '0' || *(stud_info->telephone+i) > '9')
5@r\zHs5d8JaEC0         || strlen(stud_info->telephone+i) == 0)
,q pw9If9JQ0        return TELEPHONE_ERROR;LUPA开源社区-Fm$FyU K,mKO]

{o3WHW.F c0    /*电邮可为所有字符*/LUPA开源社区u? P4q#i_-W*O
    /*for (i=0; i<stud_email_len; i++)
3[9b,YKZ/K3WY0      if(strlen(stud_info->email+i) == 0)LUPA开源社区w-G.E r%i&O)s4jp!g N
        return EMAIL_ERROR;*/
8B+iA)gH ]l0LUPA开源社区2[B*q8Iv6YG\
    return SUCCESS;
z ui+o ^"ZbJ0}LUPA开源社区{D0tIY'B[
  LUPA开源社区q @c.j.`:P
 
F Q8l1w#`p\3po0/* 函数*sinode_nextLUPA开源社区-} S$E8} CxL
 * 无形参LUPA开源社区_#SP,N&F(I$S5u
 * 返回指针记录
6g.g9eZ{9x8v0P {3myc0 * 作用:调用sinode_reload函数,一次从CODE索引文件读取16个记录,一直读到文件尾,LUPA开源社区z{ S!SN
 *      返回一条记录给调用函数ins_inode*/LUPA开源社区i_"yqT!Uni

U[{8m@n@2lA0extern struct sinode *sinode_next(void)
jVU2~mj6m1T0{LUPA开源社区2_/T ~(K%^*BP(B
    struct sinode *sinode_recp;
yXG?GKyW0    while(1)
LP6Wk/xb0    {
w3zdaQ@0        if(cur_rec == num_recs && sinode_reload() == 0)
H0c$z FDK0            return NULLINODE;
@#M/l'W3Vj3P0        sinode_recp = indebuf + cur_rec;LUPA开源社区:t+R,j"_#|3r$_
        cur_rec++;
;U*N d;}^ w0        return sinode_recp;LUPA开源社区4?4k+jtSM&?'c/O
    }LUPA开源社区o:cm~*Qk
}LUPA开源社区+_\lTB"X]0dS C

"G {/Yd+X0
R{*_nlm0/* 函数:sinode_reload
:] d6y0A E0 * 无形参
2UI&M3~/Fz#uT*k^0 * 返回读取记录数
;W8Da;fDju9A1Y#Y'm0 * 作用:一次读16条记录,同步NAME索引的文件指针位LUPA开源社区 `xQ}+T0i
 * */LUPA开源社区 fyT)ofY6f
extern int sinode_reload(void)
T8v U l1qyr0{
;K:})MV7e0    int amt_read;LUPA开源社区B*r*N l4Q"lC
    amt_read = read(fd_indx, indebuf, INODE_SIZE * NRECS);LUPA开源社区U[/`4c#^%{/C
    read(fd_sort, sortbuf, SORT_SIZE * NRECS);
2hu#ggRf!t:a*h0    num_recs = amt_read/INODE_SIZE;LUPA开源社区(}j+N2H8GU(Q
    cur_rec  = 0;LUPA开源社区O5l{(}8J&^
    return num_recs;LUPA开源社区g0B,eMi1Q
}LUPA开源社区e[ B;`_5?6S_%hM2p

+uk+jsW+e8_z c/d*p:v0LUPA开源社区W%``pm;Gr1eJn
/* 函数:itoa
&j%f9m } n){le0 * 形参:待转换整数n,转换后数组s[]*/
/V9I'P:u5H$m~S0void itoa (int long n,char s[])LUPA开源社区7h2HS"y+q*c{#Rh
{LUPA开源社区i u!C(c D+n
  register int i,j,k,sign,t,dou;LUPA开源社区8}x9M7}d ZG\^
  if((sign = n) < 0)LUPA开源社区yXw ~Y7Il
    n = -n;
7E mt)bqY$r0    i = 0;LUPA开源社区Kv/Pb XO
  do{LUPA开源社区tCOB^M&u^5sT
       s[i++] = n%10 + '0';LUPA开源社区 [OWY:e7T4u
    }while ((n /= 10)>0);
2bYZ ? _p&v$l0LUPA开源社区4nX*Z'[ ^.b$I1I
  if(sign < 0)
9u1}:?#|h%\,pm0    s[i++] = '-';
^9a{(C4a%u0LUPA开源社区(d^*ZT X(k
  dou = (--i)/2;LUPA开源社区b"ba2rO
  for(j=i,k=0; dou>=0; j--,dou--,k++)
!Bv}u {J0z4e0  {LUPA开源社区`2A9L5fL&p8_l
    t = s[k];LUPA开源社区q3C!}aWB9S
    s[k] = s[j];
a!cj'yW0    s[j] =t;LUPA开源社区C2V/X0Z S
  }
uT'F!J`*\ u0  s[++i]='\0';LUPA开源社区.kHI2mq&tH
}
J H0N&R&Hh0LUPA开源社区ju/{n.bXpB
LUPA开源社区'On+ls-^7Rc

$xbTu0[#\5g0/* 函数:ins_inode
~!I+r jS[9Vp0 * 传递形参:新记录在文件尾中的地址rec_addr,学生code,学生name
?*R8{6@!t/\ x0 * 返回参数:新记录在文件中的绝对地址,有可能在文件中,也可能在文件尾
&sUE w~dkF0 * 绝对地址在文件中即为删除记录,用新记录覆盖删除记录LUPA开源社区E~$~*u-_)I5Jye
 * 绝对地址在文件尾即为没有找到删除记录,只能在文件尾追加
s7q+[T%]$s0 * 作用:同步CODE索引文件,NAME索引文件
9w9G.H!Ly5d!D4\x0 * */
DU"H"q cP0
L r8CY~8K*l"{0extern int ins_inode(int long rec_addr, char *code, char *name)
P5fFq)f:RPC0{LUPA开源社区"W9y zh1f?0SucM
    struct       sinode  *currec;
nm%K^ H+wn]!^@0    static int   rec_num;
4S9V7Zj E![ WE2r8F/W0    currec       =       (struct sinode*)malloc(INODE_SIZE);
we%n L|1n0    indebuf      =       (struct sinode*)malloc(INODE_SIZE * NRECS);LUPA开源社区X|WR"CL `,t

2?lz]8~4H'tm0    memset(currec,      '\0', INODE_SIZE);
)WD y G~%x O*z9Yg0    memset(indebuf,     '\0', INODE_SIZE * NRECS);LUPA开源社区 w6t&v9G]Aa
LUPA开源社区v O?#A-aeAK6n7lQ
    char addr[20];      LUPA开源社区C;^4`nH~~2Uh
    memset(addr,        '\0', sizeof(addr));
@c{f0Xy z)}0    cur_rec = num_recs = 0;
Y ^2CA$N2G(~"Z~&U6x0
&sCwe/K&x0LUPA开源社区5k(mvk2QBYs-[
    /*打开CODE索引文件及NAME索引文件*/
$`j7nR@ L'Z/I0LUPA开源社区6Hb a$caE4B
    if ((fd_indx = open(INDE_FILE, FILE_OPEN_RW, FILE_OPER_LIMIT)) == -1)LUPA开源社区&QY)C3`V,i
        error(OPEN_FILE_ERROR);
|`1Vy8M#f _0LUPA开源社区u E8Ad @8w g$mnM']fE
    if ((fd_sort = open(SORT_FILE, FILE_OPEN_RW, FILE_OPER_LIMIT)) == -1)
AD?hKx4f{:g9P0        error(OPEN_FILE_ERROR);LUPA开源社区 qd C#p1pn |

.z(I2A QRb0    /* 调用函数sinode_next,取一个学生CODE索引,比如此学生是否为删除状态
F0@8v.azUug{;S0     * 如果为删除状态,调用函数atol转换字符串地址数组为整型数*/
m)C#MoY-twH8F`0    while((currec = sinode_next()) != NULLINODE)
,bJJ??,?e+f5m0    {LUPA开源社区gbL H$e&?!h |V
        if(strcmp(currec->flag, INODE_IS_NULL) == 0)LUPA开源社区9\2}8`E BCN
        {
*_,OS&?7l0            rec_addr = atol(currec->addr);
$@7`?j7[ Ovik0            rec_num = cur_rec - 1;
0y*q5X8f4d0           LUPA开源社区.T'tl;z8z&_ `+wA'n
            /* 用系统函数lseek定位CODE索引文件中的位置LUPA开源社区)e;] pN Q(I Q*p
             * 重置索引文件中的状态为1,即未删除状态,更新索引中的code域*/ LUPA开源社区l|'ogJtn2[!v
            lseek(fd_indx, rec_num * INODE_SIZE, SEEK_SET);
x:L/xxs3uxa/W0            write(fd_indx, INODE_NO_NULL, sizeof(INODE_NO_NULL));LUPA开源社区8s#J3YoBg FNX)z.H#Z
            write(fd_indx, code,          CODE_LEN);
C*w*DJNw0            LUPA开源社区I8b~b,j*c-`
            /* 用系统函数lseek定位NAME索引文件中的位置LUPA开源社区'u:Bt#V0d4h"O I,V
             * 重置索引文件中的状态为1,即未删除状态,更新索引中的name域*/LUPA开源社区A ?`B'Ds.ji5UJ
            lseek(fd_sort, rec_num * SORT_SIZE, SEEK_SET);
C#Lw3]8E%sSh:v0            write(fd_sort, INODE_NO_NULL, sizeof(INODE_NO_NULL));LUPA开源社区8S8bU%P]$u
            write(fd_sort, name,          NAME_LEN);
+J6z!G\(z mn)^"qJ0LUPA开源社区x@O8c"R+|2f*@
            close(fd_indx);LUPA开源社区:`xVe}@U#t
            return (rec_addr);
S6O4gq:P:KY0        }
$A1~S Z X$Y8fI~0    }
p,Z;cg(Nv~}*F0LUPA开源社区,jYA{;s1Q{
    /* 如果没有学生处于删除状态,则在CODE索引文件和NAME索引文件追加索引记录*/
K+x r0H)a0t'K*hF^0    /* 包括FLAG位,CODE位,ADDR位,回车位,CODE索引文件与NAME索引文件始终处于一致*/LUPA开源社区2b6h |q pLM\1RJ
    lseek(fd_indx, 0, SEEK_END);
VTc4@;z`0    if (write(fd_indx, INODE_NO_NULL, 2) != 2)
"F}Mk9iD~z0      return WRITE_FILE_ERROR;
HFe {7go0   
s5}3Th+[M+H1E&O0    if (write(fd_indx, code, CODE_LEN) != CODE_LEN)LUPA开源社区/kcn0w#r$O
      return WRITE_FILE_ERROR;LUPA开源社区%aV${:YZn i+D)B

|-_X%ia*M0    /*调用itoa自定义函数,将整型数rec_addr,换转为数组addr*/
'VF [N*Z.^I6e0T:@0    itoa(rec_addr, addr);LUPA开源社区*xb1d3E? j;j
    if (write(fd_indx, addr, sizeof(addr)) != sizeof(addr))LUPA开源社区2{#o$z)A2jA
     return WRITE_FILE_ERROR;
@N:T zL-Y'af0
,m6R4p"_| E0    if (write(fd_indx, &enter, 1) != 1)LUPA开源社区/B%V gL3u
      return WRITE_FILE_ERROR;LUPA开源社区 `2QI?-n9R%R

%eiPv_9?#_0
qqAz5S;q!O0l0    lseek(fd_sort, 0, SEEK_END);
v:u \ vm7s0    if (write(fd_sort, INODE_NO_NULL, 2) != 2)LUPA开源社区?$sMN.lF7V
      return WRITE_FILE_ERROR;LUPA开源社区#u(J%y6b c
   LUPA开源社区 QK*?[ch,b
    if (write(fd_sort, name, NAME_LEN) != NAME_LEN)
fe8c6Yfm'C0      return WRITE_FILE_ERROR;LUPA开源社区4~X8r6SO,xI

(R7L!p?i H-_h:~0    if (write(fd_sort, addr, sizeof(addr)) != sizeof(addr))
x!x'H%_$t*c,B0      return WRITE_FILE_ERROR;
}l^M8H vu]0LUPA开源社区2J$Z)K1M_k
    if (write(fd_sort, &enter, 1) != 1)
/~0dA FU,V0      return WRITE_FILE_ERROR;
9c9Q;S7_n:{~Du0 
@'v0t A+H2v VH0    free(currec);LUPA开源社区6y3r1yhKN
    close(fd_indx);LUPA开源社区'[e'U.w"J/Ap.Rv
    close(fd_sort);LUPA开源社区R`9xZ#K yc2V5H|
    return (rec_addr);
Y*M#}Sd0}
?UZR3})\or0
k+p.Cp,[V,d0LUPA开源社区u!Q'FNm4l7uK
/* 函数:write_studLUPA开源社区#A;f&TBvW
 * 传递参数:*stud_infoLUPA开源社区h'A$~!T5F \-R
 * 作用:写学生信息到学生管理文件中
pL-M` wd'zw|0 * 返回值:各种错误代码LUPA开源社区QM0@ n)i [ob5a
 * */
MS N P.pa/\y&N0LUPA开源社区s!XZ&m:NeC8[*Z
extern int write_stud(struct stud *stud_info)LUPA开源社区q*I_4W8pL!gZ
{
vZ6x(l;|.fVtfC(J0    int rec_addr;LUPA开源社区B,c j%| j2e'g7`M3d
    int file_addr;
[])r4R,QJ0   LUPA开源社区+Lpx\u%k
    /* 打开学生管理文件,调用系统函数lseek()到文件末尾LUPA开源社区 wT)p`7R(PV
     * 调用ins_inode自定义函数,传递实参(文件末尾的地址,学生的学号,学生的姓名),
7r-ik.Q8Rm0     * 返回要插入新记录将来在文件中的地址,利用lseek对文件重定位,
0i$@8IroUN0     * 指向新插入记录的地址*/
%doBE1[E U5H6`0    if ((fd_stud = open(STUD_FILE, FILE_OPEN_RW, FILE_OPER_LIMIT)) != -1)LUPA开源社区)Cf-R bd8^f Q
    {LUPA开源社区X0i4@ uu+D'S
         file_addr = lseek(fd_stud, 0, SEEK_END);LUPA开源社区y-^a!i_1{2O#l
         if((rec_addr = ins_inode(file_addr, stud_info->code, stud_info->name)) == WRITE_FILE_ERROR)LUPA开源社区E P)F9rV6f!pu
           return WRITE_FILE_ERROR;
xa-V0CJNA"Lxza0         lseek (fd_stud, rec_addr, SEEK_SET);LUPA开源社区Dj_w NdXBhh
    }LUPA开源社区U5W5I ^ C-D u+W
    else
3J#y]TF;d0         return OPEN_FILE_ERROR;
e5nP/RYl0LUPA开源社区W)S[vT,l9e5d/S
    /*将学生信息写入学生管理文件中*/LUPA开源社区q$aCx;_[
    if (write(fd_stud, stud_info->code, sizeof(stud_info->code))
;lU)^2^_ A0        != sizeof(stud_info->code))
*]8VY~-|4FkV0        return WRITE_FILE_ERROR;
$Jw`v1lG E7W\0
0c#cj f6p0    if (write(fd_stud, stud_info->name, sizeof(stud_info->name))LUPA开源社区2R'LD@:Z7dz
        != sizeof(stud_info->name))
[J C| @ C0        return WRITE_FILE_ERROR;LUPA开源社区L&X ^M1z X ?'I
LUPA开源社区B GjC*ucv6J
    if (write(fd_stud, stud_info->age, sizeof(stud_info->age))LUPA开源社区:D/cRj`^f
        != sizeof(stud_info->age))
M]G{2pYxD!y0        return WRITE_FILE_ERROR;
z,E c}"X0
5^4V3AyO^+A0    if (write(fd_stud, stud_info->sex, sizeof(stud_info->sex))LUPA开源社区X#p?jO8\
        != sizeof(stud_info->sex))
BZ~6m0XHL @0        return WRITE_FILE_ERROR; LUPA开源社区q1ObY$qF(p;H`Y
LUPA开源社区v!XtFl[
    if (write(fd_stud, stud_info->date, sizeof(stud_info->date))LUPA开源社区D ? _)pp5s&H
        != sizeof(stud_info->date))
&@Z/@3~u*}D1a&N0        return WRITE_FILE_ERROR;
S8d8`:HY C0LUPA开源社区Zm3dHC8w1ZG
    if (write(fd_stud, stud_info->address, sizeof(stud_info->address))LUPA开源社区(Z-\~%c4PSJX)d~
        != sizeof(stud_info->address))
*PE s:CQB0        return WRITE_FILE_ERROR;
5O"P.uGm0}~0x0LUPA开源社区b2Q h+Hf+F^
    if (write(fd_stud, stud_info->telephone, sizeof(stud_info->telephone))LUPA开源社区 m4\4E)Lm9DX D
        != sizeof(stud_info->telephone))
?6mjq8}0        return WRITE_FILE_ERROR;
{YY7~ X \5I8t;p0LUPA开源社区3TO ~+B2E5?
    if (write(fd_stud, stud_info->email, sizeof(stud_info->email))
w8? lA"{%o2B;k&lk1|Jk0        != sizeof(stud_info->email))
+Z#cd@A@7]2|T0        return WRITE_FILE_ERROR;LUPA开源社区i!@6y9N0r}

b'|,a$V'^%jn0    if (write(fd_stud, stud_info->flag, sizeof(stud_info->flag))
A4mV$re X r#v {0        != sizeof(stud_info->flag))LUPA开源社区QvY%pC5AI Mngf
        return WRITE_FILE_ERROR;LUPA开源社区$\6PUI8pl$^S5M1E:e
   
9meQ~P0    if (write(fd_stud, &stud_info->enter, sizeof(stud_info->enter))LUPA开源社区k)[-hI6N
        != sizeof(stud_info->enter))LUPA开源社区~Facrm Q`5@1M
        return WRITE_FILE_ERROR;
PE5AW2aP@0    LUPA开源社区 T-}n3t y J4M/^N1hA'N
    printf("input any button return main...");LUPA开源社区OPQ7Q;w{ m
    getchar();LUPA开源社区1YR0d_7Q;@ K3V C
    close(fd_stud);LUPA开源社区3a qY r] R I
    return SUCCESS;LUPA开源社区M2LR+F`Z
}LUPA开源社区 {Ve uj

+hPRA&E"g z0
:mCEU:P2|q s#P0
'^1z['^.k+MM5U }0/* 函数:input
{L@(dfI*m"K0 * 无形参LUPA开源社区p(| uZVM1GF
 * 无返回值
EUM'D p)CHX0 * 作用:输入信息到stud_info结构体指针变量中,调用write_stud函数写学生管理文件
^:K@C-ny)F p0 * */LUPA开源社区0n k+u2? k_
extern void input(void)LUPA开源社区)IF0? {,V'p
{
?Ee0ycw0    struct stud *stud_info;
3[8R9n b5YF)o3@0    stud_info = (struct stud *)malloc(sizeof(*stud_info));
@N4@;ap H+i;UJ0    memset(stud_info, '\0', sizeof(*stud_info));LUPA开源社区;u3hl ] Q4~^XO!]2j
    system("clear");
&a s-Ynp C0
a;a7rk w9_ u0    printf("code:"); LUPA开源社区5A!U#ux6Dm/Kf;N
    fgets(stud_info->code, sizeof(stud_info->code)+1, stdin);
'@f&IZTp,tKz0    dump_line(stud_info->code);LUPA开源社区,y8o q/Zi
LUPA开源社区7m] ON jPg#R1T+q
    printf("name:");LUPA开源社区Hx*y6i6En5P!O"n@R
    fgets(stud_info->name, sizeof(stud_info->name)+1, stdin);LUPA开源社区E0@~ K,l$Gd(Z
    dump_line(stud_info->name);
3^H4h^Jq+z:K`0LUPA开源社区bF T r1U5{
    printf("age:");
j W2Gw%} E0    fgets(stud_info->age, sizeof(stud_info->age)+1, stdin);LUPA开源社区.i1J6W;U$mi/u6q
    dump_line(stud_info->age);LUPA开源社区:Qh&r0BO8M*~-Q2@
LUPA开源社区9Y poefo
    printf("sex:");
4^$v7axn,j0    fgets(stud_info->sex, sizeof(stud_info->sex)+1, stdin);LUPA开源社区sw;BE_
    dump_line(stud_info->sex);LUPA开源社区)J{Pr*hl S$xB
LUPA开源社区3@7|p'A0vR"?
    printf("birthday date:");
;gA+U`ERa0    fgets(stud_info->date, sizeof(stud_info->date)+1, stdin);LUPA开源社区s[ UX mr C
    dump_line(stud_info->date);LUPA开源社区1X;zl1A Ox7S
LUPA开源社区J~.jM0WsX
    printf("address:");LUPA开源社区-K*S:H9[ _
    fgets(stud_info->address, sizeof(stud_info->address)+1, stdin);LUPA开源社区;PH*h%jG8BAFl
    dump_line(stud_info->address);
k)q8zP }SD0
5A Y8^g4j`gC0    printf("telephone:");LUPA开源社区 FZm9ZiGq
    fgets(stud_info->telephone, sizeof(stud_info->telephone)+1, stdin);
iL ^y3hJ Q(a6t0V0    dump_line(stud_info->telephone);
(a-u#`W u0
3SV%~ Z Z+\ N'h0    printf("email:");
`1` I+YW%m&k0    fgets(stud_info->email, sizeof(stud_info->email)+1, stdin);
_#E(s jM2W_ e0    dump_line(stud_info->email);
^,S;Nfq(N0
SF&s };n+x.f+S0    strcpy(stud_info->flag ,INODE_NO_NULL);LUPA开源社区 tGy$J.dV
    stud_info->enter = enter;
Ry,}j9{d0
4M!@l^{]P0    /*调用函数check_line,检测所有字段是否为有效值LUPA开源社区n8h1Z%aT^&y[
     *判断其错误码,返回相应的错误提示
'j?X"z8P#^5@K0     */LUPA开源社区 ]P%n!{h%|s7R ^.l
    switch (check_line(stud_info))LUPA开源社区 }}Px nuM,g
    {LUPA开源社区H4X4i8r\HAE
        case CODE_ERROR:       printf("Input student code error!\n");LUPA开源社区%J(e P Zpg `BDk }+l
                                error(INPUT_ERROR);break;LUPA开源社区a Oh3Q*K
        case NAME_ERROR:       printf("Input student name error!\n");
~plF%r:K9j"n0                                error(INPUT_ERROR);break;
|;LcS eB0        case AGE_ERROR:        printf("Input student age error!\n");LUPA开源社区nV#i#z*_
                                error(INPUT_ERROR);break;
B9LM2~Y)Z%b~3o0        case SEX_ERROR:        printf("Input student sex error!\n");LUPA开源社区!^a4H3V9i+s&yR\"U
                                error(INPUT_ERROR);break;
eZ~9o{0        case DATE_ERROR:       printf("Input student data error!\n");
v ^^AP)fC:i0                                error(INPUT_ERROR);break;
#m"\)}a6d0        case ADDRESS_ERROR:    printf("Input student address error!\n");
$s&zug} |g0                                error(INPUT_ERROR);break;
CM9iV8_1XO8ZJ0        case TELEPHONE_ERROR:  printf("Input student telephone error!\n");
#y4Hi.O$R0                                error(INPUT_ERROR);break;
O,~#b \2b~%vu q0        case EMAIL_ERROR:      printf("Input student email error!\n");LUPA开源社区7gs k| G
                                error(INPUT_ERROR);break;
9S3dL/k7|_U2W1\0        default:               if(write_stud(stud_info) == WRITE_FILE_ERROR)LUPA开源社区?:R1T`,`Rd-Y xR"U
                                error(WRITE_FILE_ERROR);          LUPA开源社区[ wRbt*hky |
    }LUPA开源社区;Yn&c J@K'EKT
    free(stud_info);
2[:fP e&i0EY%q{H0}LUPA开源社区p k S:B`MB0} o

$Z7x0n wy/E9w~0///////////////////////////////////////////
|*n?9t,qT4T5uX0//delete.c
W'Tm{^B)@E O0///////////////////////////////////////////LUPA开源社区*K}/TUVL*hO(\5~
# include <stdio.h>LUPA开源社区%E[~`K#l7u;F
# include <stdlib.h>LUPA开源社区K(tc Y1y
# include <fcntl.h>LUPA开源社区$X9T5sJ}-A[I)b9g
# include <unistd.h>LUPA开源社区1^-lo(~(@B$YC
# include <sys/stat.h>
,`TvSlp%|0# include <string.h>
:A3x4lm"X9p0# include <termios.h>LUPA开源社区(^qg'Y6Us:_
# include "main.h"
qd0DG:M {[0LUPA开源社区0j~ {:P Gm*G(w+Bl7L

6zCF#x a?0LUPA开源社区ll;v4a^8On4~
struct  sinode     *indebuf;
q |.QM%y"fjVX0
$T9F6aB1d?Y]V Z0int         cur_rec;LUPA开源社区Oxp}e M
int         num_recs;
([xO'GBuh\0LUPA开源社区_^B1^9A2a S.OP

0m;lO0} ]sF0extern void delete()
-`!?Q O&E_ ?B0{
1V4o hT~nG~0    struct sinode *indedel;LUPA开源社区xIS6j-` k$D[
   
.f L8w{ _Ro*r|0    char code[8];LUPA开源社区1^ vqk;lQ(P
    int  rec_num;LUPA开源社区6D4A*c7jf
    int  flag = 1;
%XC!Go$[,w0
1KpB5pET0    indebuf = (struct sinode *)malloc(INODE_SIZE * NRECS);
cz}diT,u#f0    indedel = (struct sinode *)malloc(INODE_SIZE);
`-|{ r'e)` dn7V0
G^Os:O w7f c%a0    memset(indedel, '\0', INODE_SIZE);
wsvY2G]f|5W$~0    memset(indebuf, '\0', INODE_SIZE * NRECS);
_y_!D8\ W0
RE0Ix8]$NWB0    if ((fd_indx = open (INDE_FILE, FILE_OPEN_RW, FILE_OPER_LIMIT)) == -1)LUPA开源社区k$H]!yx4n'H
    {
z_8H6PL+G0        error(OPEN_FILE_ERROR);LUPA开源社区Mt9R6K E fux9i'^
    }LUPA开源社区hqZ!Fg? b

8d%D._akK0    if ((fd_sort = open (SORT_FILE, FILE_OPEN_RW, FILE_OPER_LIMIT)) == -1)LUPA开源社区$LI_ B&\8P!GH
    {LUPA开源社区^1G2S \P&r
        error(OPEN_FILE_ERROR);LUPA开源社区%NN-o_0c&ww:y-A4S)^
    }
Lh!x)w)`A3N+G y p0
2K8Nutlj5O0    if ((fd_stud = open (STUD_FILE, FILE_OPEN_RW, FILE_OPER_LIMIT)) == -1)
:e K3rrE1W4o a7{K0    {
t3hmG,P^OaA0        error(OPEN_FILE_ERROR);LUPA开源社区&rt&J%t n}I
    }
| C!H&u(i-~ V0LUPA开源社区i*\`V @| ^.Q6[;bD
    printf("input student code:");
0C&H'}8yW'M{r0    fgets(code, sizeof(code)+1, stdin);
wr*S sB0    dump_line(code);LUPA开源社区H wDT&l@

"Z$rx g+G)C[0    int rec_addr;
)D2Fg$cw@;Rb0    cur_rec = num_recs = 0;LUPA开源社区f r l[|n
LUPA开源社区+N4pH n3u#LXI
    while((indedel = sinode_next()) != NULLINODE)LUPA开源社区8[.[U#^%A/n.~)jWM ]j
    {
;C[$NUV,nRT0        if (strcmp(code, indedel->code) == 0)
&{w2qi7r9p0        {
| X&^z}T L0            rec_num = cur_rec - 1; LUPA开源社区-LG"[F R?l
           LUPA开源社区h:E8w+Z$yT ey
            lseek(fd_indx, rec_num * INODE_SIZE, SEEK_SET);LUPA开源社区0H:sXj t1aj3H.F8f
            if (write(fd_indx, INODE_IS_NULL, sizeof(INODE_IS_NULL)) != sizeof(INODE_IS_NULL))
V4e](}k H.X0                error(WRITE_FILE_ERROR);LUPA开源社区 PFREmY+g9qB~
      
MabXs+J/b _.N0            lseek(fd_sort, rec_num * SORT_SIZE, SEEK_SET);
P]D~,g I5o0            if (write(fd_sort, INODE_IS_NULL, sizeof(INODE_IS_NULL)) != sizeof(INODE_IS_NULL))
jxW(F:d0                error(WRITE_FILE_ERROR);LUPA开源社区OKI$E j-C a3P6Y
LUPA开源社区 ^ji#y6q!|?`]2z
            rec_addr = atol(indedel->addr);LUPA开源社区i H0k\8Y%Z$q{
            lseek(fd_stud, rec_addr+STSIZE-3, SEEK_SET);LUPA开源社区#W`7r[/FJJ[
            if (write(fd_stud, INODE_IS_NULL, sizeof(INODE_IS_NULL)) != sizeof(INODE_IS_NULL))LUPA开源社区$YKX8{%T
                error(WRITE_FILE_ERROR);LUPA开源社区'D)W*M%{5d5v
LUPA开源社区k1DbOv!K`? ?
            printf("Delete success!\n");
&U ta JnId0            flag = 0;LUPA开源社区$A$t&e:w4E9D \
        }LUPA开源社区&[4@:Tq!B `s3{
    }
[ `4r|1SW;?4d0    if (flag == 1)LUPA开源社区j#b$X w!O
      printf("A student does not exist!\n");
,b)Wf9H9R8{g9my/JI9p0    
*Y2w6g+WO`0    printf("Press Enter Continue.....!\n");LUPA开源社区{w^'O.O
    getchar();LUPA开源社区$RYne0SI$d"IN c

`6\ K N Z g A'_3?w0    free(indebuf);
W$Q.J%|RoU!vP c0    close(fd_indx);LUPA开源社区 ~~&qu@,N
}
3\!_@ D:A,B+a^0
y"}(Q-bo0///////////////////////////////////////////////
@lA S(\*ZG0//show.cLUPA开源社区I S0W3N@8n6p(h
///////////////////////////////////////////////
-JMt'^8iN"z0# include <stdio.h>
lz @NE ucc9|i0# include <stdlib.h>
NE"KWt7}j0# include <fcntl.h>LUPA开源社区4[7~K*aLaB|
# include <unistd.h>LUPA开源社区NN/[q(dpm2T+u tA K/h
# include <sys/stat.h>
d \G"NX&LVcI^&r0# include <string.h>LUPA开源社区/cY3g?I]
# include <termios.h>LUPA开源社区v*wP a4L@ H
# include "main.h"LUPA开源社区ppJ"tFSC:bj
LUPA开源社区)HG)w'DhG
LUPA开源社区RNoo1_[kg D
struct stud  *stbuf;LUPA开源社区)j2B+B:X2eK%Z.W
struct stud  *show_rec;LUPA开源社区*l.[#p`hA'[P'E&Z
int   cur_rec;
E&R#aP3i!fW0int   num_recs;LUPA开源社区Pc;CWMkB

;NELG^h0extern void max_show_title(void)
P6nMJ/C0{LUPA开源社区UJ6yr7l @ y
    printf("%-8.8s",   "code");     printf(" ");LUPA开源社区g[-hY#P_ J'V]
    printf("%-20.20s", "name");     printf(" ");
R#]`sNIx0    printf("%-4.4s",   "age");      printf(" ");LUPA开源社区D;_,JO(J0u9r
    printf("%-3.3s",   "sex");      printf(" ");LUPA开源社区'yx1FY NRf
    printf("%-11.11s", "date");     printf(" ");LUPA开源社区0[Z'n rc$j
    printf("%-30.30s", "address");  printf(" ");
:g5H"Gor6U0    printf("%-24.24s", "telephone");printf(" ");LUPA开源社区"[GD,QD ]
    printf("%-30.30s", "email");    printf(" ");LUPA开源社区"EDE l]L
    printf("\n");
7~b oQ"M+^0}LUPA开源社区C9F?L:gK
LUPA开源社区h2[G-V]%d,f-n,G
LUPA开源社区;{ A/V$r!c2K4k
extern void min_show_title(void)
)`T*wKYH0{LUPA开源社区4X T-S C6U"`A]yK3m
    printf("%-5.5s",   "code");     printf(" ");
4d yJ9V#Kh~0    printf("%-15.15s", "name");     printf(" ");
!fg ^rq2\z0    printf("%-4.4s",   "age");      printf(" ");LUPA开源社区o&P"yIqP
    printf("%-3.3s",   "sex");      printf(" ");LUPA开源社区p2Ap]g0H8i
    printf("%-11.11s", "date");     printf(" ");
Mz/}9f8GW7E ^Cv1o0    printf("%-18.18s", "address");  printf(" ");
Asv*c&T)fZ5M^0    printf("%-15.15s", "telephone");printf(" ");LUPA开源社区e*Te%tu qt#}7c1?
    printf("%-16.16s", "email");    printf(" ");LUPA开源社区1PD\2q ~+MK Lp
    printf("\n");LUPA开源社区x2D:UBb'},C a*b C G
}
:?/`(`8r.xa#NRs/[0LUPA开源社区c#W)Q2C$r
LUPA开源社区Hg,A/VZ@

/aeG8b3vz'M0extern void min_show_data(struct stud *stbuf_cur)
9tN~ eL0{
+I T N!e*`m A0    printf("%-5.5s",   stbuf_cur->code);     printf(" ");LUPA开源社区'gk0a:KhtfJ l
    printf("%-15.15s", stbuf_cur->name);     printf(" ");LUPA开源社区m'v THacfL
    printf("%-4.4s",   stbuf_cur->age);      printf(" ");LUPA开源社区.J"s$x3A;gwV
    printf("%-3.3s",   stbuf_cur->sex);      printf(" ");
8y/FZ:NFk]w0    printf("%-11.11s", stbuf_cur->date);     printf(" ");
9g/M2v#o]5tOO0    printf("%-18.18s", stbuf_cur->address);  printf(" ");LUPA开源社区|O)t0y~
    printf("%-15.15s", stbuf_cur->telephone);printf(" ");LUPA开源社区)iU e|jH&s0G
    printf("%-16.16s", stbuf_cur->email);    printf(" ");LUPA开源社区/\+|r]yn
    printf("\n");LUPA开源社区r&O:[4o H3{7[_ciB
}
1XNO5l&ef:dT0LUPA开源社区m_)`(_Ku*}s
LUPA开源社区$?9V%`S{_ph

0bE s _}0extern void max_show_data(struct stud *stbuf_cur)LUPA开源社区bk-n[w
{
uN+B9Y,Q![f \D0    printf("%-8.8s",   stbuf_cur->code);     printf(" ");
*i{$DRNUq0    printf("%-20.20s", stbuf_cur->name);     printf(" ");
a9[E&Jwk^)[0    printf("%-4.4s",   stbuf_cur->age);      printf(" ");
FLf$S#A%Q0    printf("%-3.3s",   stbuf_cur->sex);      printf(" ");
j\b9_6f9M7~gdfV0    printf("%-11.11s", stbuf_cur->date);     printf(" ");LUPA开源社区:^f4q3mo2D/~ Q o
    printf("%-30.30s", stbuf_cur->address);  printf(" ");
jr!j$tXLK0    printf("%-24.24s", stbuf_cur->telephone);printf(" ");
5M3A IXU.cIm5K7N^0    printf("%-30.30s", stbuf_cur->email);    printf(" ");
h%f FYZ#OLF R0    printf("\n");
$D#y+te i9Y0}
Lu7C b8q%b2M{&I[ O0LUPA开源社区'Nq\*C kC z
extern struct stud *stud_next()
J7z.tX5E3g0{
,w8?K6U B0    struct stud *stud_recp;LUPA开源社区8?&wv?(~Z n S-Z
    while(1)
L ^Kh[(U0    {
w e(j5h+S6c G0        if(cur_rec == num_recs && stud_reload() == 0)LUPA开源社区)MI ?aC[f0J
            return NULLUT;LUPA开源社区8]z+kMO'@` Z6W6}
LUPA开源社区h0C$E f:^9~
        stud_recp = stbuf + cur_rec;LUPA开源社区 cN d hTg X&U
        cur_rec++;LUPA开源社区8z8P/h'x0TK+t5}4PS+Nz
        return stud_recp;LUPA开源社区Me0e?^,_
    }LUPA开源社区U6Sh*{5^Q;w
}
i tr \&x~4w[ E0LUPA开源社区9ah H5l%qJM&L
LUPA开源社区/GC8@0aj6mm1Mr
extern int stud_reload()
'I WjHr;vn0{LUPA开源社区 FUX$vbw!a E9i&~)p"i
    int amt_read;
&ip-T(P R+S$y2Ni0    amt_read = read(fd_stud, stbuf, STSIZE * NRECS);
P4q[@eTAQ#L jq&Zz0    num_recs = amt_read/STSIZE;LUPA开源社区0Z3L`0p$}^5yK1v'Ac
    cur_rec  = 0;
p&z i ]c$LA8w?0    return num_recs;LUPA开源社区4C'V9F:P*G|2u[|_/{O
}LUPA开源社区6g3[a*d7\ Q

a_Z3dogt0
C(w Da*E0LUPA开源社区mg2b9N2Ad/P+^!w`{
extern void show(void)
$@(C M$P5d)[0{LUPA开源社区%i2x;n7e\r h
    stbuf    = (struct stud *)malloc(STSIZE * NRECS);
+t)}d8gKL0    show_rec = (struct stud *)malloc(STSIZE);LUPA开源社区k{jW)DKy7_
LUPA开源社区L0o~?r$l5r[X E
    memset(stbuf, '\0', STSIZE * NRECS);
}?;L0b)J;^YS0    memset(show_rec, '\0', STSIZE);LUPA开源社区$f.`C@(p U"D
    char ch;LUPA开源社区,E%B p:USb5{
    cur_rec = num_recs = 0;
+~8ld+x"Iq%D0    if ((fd_stud = open(STUD_FILE, O_RDONLY)) == -1)
3cY Ly!k e ]|0      error(OPEN_FILE_ERROR);
Q n z5N*cR0    printf("1)max show all field data:\n");
E f7CX:g0    printf("2)min show all field data:\n");LUPA开源社区P,w:G5Q5c`
    printf("choose show mode:\n");LUPA开源社区!or1jic(s
    ch = getchar();LUPA开源社区*N1i3v(yRFP
    dump_line(&ch);LUPA开源社区4r,KF!ZV5L,X Fv
    getchar();LUPA开源社区&D X"cvG&o
    switch(ch)
+g-bif5d&n8CX.OW0    {LUPA开源社区 e g;L5A2u.A
        case '1':{max_show_title();LUPA开源社区8c_(X4BM9W H ^8?B
                  while((show_rec = stud_next() )!= NULLUT)LUPA开源社区 NHEh e1X1NU
                  {
b ~8L Z1r'JoI0                    if (strcmp(show_rec->flag, INODE_NO_NULL) == 0)
u,K |+lBG*Z0                      max_show_data(show_rec);LUPA开源社区gD8o6v-^ F
                  }
-|btu'G0D0                  printf("Press enter conintue...");
q/C"M T]UOF0                  getchar();break;}
;Up3t%Z$}r0LUPA开源社区6D)h:Lmy!h
        case '2':{min_show_title();LUPA开源社区 PA5\/mx EI&w
                  while((show_rec = stud_next())!= NULLUT)LUPA开源社区Y0Y;OfF7Z-M"g'x3f
                  {
^Q1N@,V8DU&T@0                    if (strcmp(show_rec->flag, INODE_NO_NULL) == 0)
'^Jy`F!^6p1n Ql0                      min_show_data(show_rec);LUPA开源社区IC:ce K;d,yS
                  }
%Tno'N4qX#G#d)B?0                  printf("Press enter conintue...");LUPA开源社区7l+VlZN;wX
                  getchar();break;}
*s&L&F1gA8F1za0       
j(n{1a7EL2BXv0        default :{printf("Input error,choose number(1 or 2):\n");LUPA开源社区k9Z5i+KG&IJ
                  printf("Press enter continue...");LUPA开源社区 tNX T7bMV|8O9h
                  getchar();}
o7H9[]}x,@i0
f-Q/YjB-g/iE0    }
/x0kO9MX4G0FT0    free(stbuf);
-As YW/vP}JPfB s0    close(fd_stud);
4q u q+qApj,v0}LUPA开源社区:[Fz#C.K b8r#j*T)^:g

s z`@C_Jx0r0//////////////////////////////////////////////LUPA开源社区6[E`3l)\*k
//find.cLUPA开源社区Q%IZ2[5@
//////////////////////////////////////////////
5f5{8g.}$ie+CP Oe0#include <stdio.h>
#Lc)N8K$h4BC0#include <stdlib.h>
2m?|!V(H _L {6nf0#include <string.h>
^*s4iN)^:t S0#include <fcntl.h>
.blYY}0#include <unistd.h>
5CBx)N Tx8[{ t0#include "main.h"
8wI:J3I D9fJdG7A0LUPA开源社区,s-oO&mr;^Y
LUPA开源社区8iA z"L*V{O!}
struct   stud      *stbuf;LUPA开源社区3f}/k7zJWy
struct   sortinode *sortbuf;LUPA开源社区Z cJ xIF4Wb,H
int                 cur_rec;LUPA开源社区\R'Xm4Q.Q.I
int                 num_recs;LUPA开源社区(B}$l-X OB,f&W;L

V9DQ!J5{;XR h5s0
u-a"_[eW\7u0extern struct sortinode *sort_inode_next(void)
QHe-s8CJ&I:s0{
p\ z }RSj0    struct sortinode *sinode_recp;LUPA开源社区)Y(K&F#j zb6e
    while(1)LUPA开源社区3U Z/oh,DR4pFSC
    {LUPA开源社区(oe3Aqk'q"s&s_
        if(cur_rec == num_recs && sort_inode_reload() == 0)
Rxvo(y0Dx0            return NULLSORT;LUPA开源社区)bn!rO7H
        sinode_recp = sortbuf + cur_rec;
(C"A5N'Cx"]9R[0        cur_rec++;
W$^Agl[5ha9e0        return sinode_recp;LUPA开源社区 vq*mSM^
    }LUPA开源社区 o_Jzu p
}LUPA开源社区5hy6]|*lF
 LUPA开源社区}uS tC+u/u5NR

(gT'n(b-?9|y0extern int sort_inode_reload(void)
)@h&Aw+}4|1s`x0{LUPA开源社区M D-V4Yx+Ul
    int amt_read;
m4tQ,pi~RP0    amt_read = read(fd_sort, sortbuf, SORT_SIZE * NRECS);
Z[aa @;?X0    num_recs = amt_read/SORT_SIZE;
C-PR LT}(hd+o^{3T0    cur_rec  = 0;LUPA开源社区4C/ev E"`[BT(}h
    return num_recs;LUPA开源社区y-q#ZF-F| D
}LUPA开源社区9wJ1ad?eZ5n H+~_
LUPA开源社区vg*@&FV+y3fh.l4d
LUPA开源社区x.`+_K2@ x U/s.Q
void find(void)LUPA开源社区2y8Q R!Dn:B+w
{LUPA开源社区%M4`jf6?"q0[;V b
    struct   sortinode  *find_rec;LUPA开源社区%D#`'l:s Z O!Uk1qTs$N
    struct   stud       *currec;
2]'L1Y!WcX2`2H0    struct   sortinode  *cursort;LUPA开源社区Z(cx/qAE)r
LUPA开源社区k!d~_wdjbI|S
    find_rec =     (struct sortinode*)malloc(SORT_SIZE);LUPA开源社区/vr)Q?W2\2p-k
    currec   =     (struct stud*)malloc(STSIZE);
b$?Nri Q3G9d0    sortbuf  =     (struct sortinode*)malloc(SORT_SIZE * NRECS);
HK!x3`_guA0    cursort  =     (struct sortinode*)malloc(SORT_SIZE);LUPA开源社区ez$@jlaDh yCm
LUPA开源社区W#I-Bje8Z3@"`K r
    memset(find_rec, '\0', SORT_SIZE);LUPA开源社区0VB5X xvEA"D
    memset(currec,   '\0', STSIZE);LUPA开源社区 DGAw3WD`4b*?*@
    memset(sortbuf,  '\0', SORT_SIZE * NRECS);LUPA开源社区+VeY&xC+jV
    memset(cursort,  '\0', SORT_SIZE);
5vSZ T&f`\?0
tyh6{ o0    int find_flag = 0;LUPA开源社区C _ ^YDGQ6P8i#J
    int rec_addr  = 0;LUPA开源社区&ry4Pj{g
    cur_rec = num_recs = 0;
7Z`$X!MP%l |nK0   
_ nz7c&^;~2uWt0
a?PA0`;D)X*M/I;V!l0    if ((fd_sort = open(SORT_FILE, O_RDONLY)) == -1)
D'\iay kU4|0        error(OPEN_FILE_ERROR);LUPA开源社区(S+CH S)z#S3iTn2RGW
    if ((fd_stud = open(STUD_FILE, O_RDONLY)) == -1)
P:yr}PP&} HF0        error(OPEN_FILE_ERROR);
,^oP?*Lr2F t"B7{p0
2Hxk j(u e L0    printf("input find name:");
s/ve&b2\}}7N0    fgets(find_rec->name, sizeof(find_rec->name), stdin);
&lis}-|+H)V^bf0    dump_line(find_rec->name);
7nw~n}[:C Q0
H_} f\4mC7t&x0
gN`7~Id%~0    while((cursort = sort_inode_next()) != NULLSORT)
kna%F4lPZqI+Z0    {
tgY;hK\W4M0        if(strcmp(find_rec->name, cursort->name) == 0)LUPA开源社区+zVJ%l%YYH}
        {
.pz:D%{M1I0            if(strcmp(cursort->flag, INODE_NO_NULL) == 0)
f2|D9`r'vl ]\3O0            {
q$s*_IX0                rec_addr = atol(cursort->addr);LUPA开源社区1X.My$]GM6ID {]#O
                lseek(fd_stud, rec_addr, SEEK_SET);
Se!x g8y"I2zf0                read(fd_stud, currec, STSIZE);
H:w7z#lh?lV!W0                max_show_title();LUPA开源社区J&b D6c5?VfwJu0Z
                max_show_data(currec);LUPA开源社区1zl#Enfg#y C
                find_flag = 1;
%FKX@L!y\0pe0            }
IVi/umX L0        }
6Zyy(c6ra0    }LUPA开源社区 SliO#yp'?

T*?~ {@0    if (find_flag == 0)
+[5X%h?rw$W0    {
K'\,C VXe0        printf("\nSorry,not found!\n");LUPA开源社区9}#V#` S `C8ad-U
        printf("Press Enter Continue.....!\n");
p#elPk}}t0    }
k6Kb6nRRPj0LUPA开源社区$C!N"G-L7v
    getchar();
Ez4qOue*{l0    free(stbuf);
Z4s,?0i7d M]0}LUPA开源社区0C!vs8VX.P J
   
+JV*D`e'U0}0
B\ o:[4s&Y Y0

TAG: C语言 Linux C语言编程 源代码 作业 期末

我来说两句

-5 -3 -1 - +1 +3 +5

Open Toolbar