Oracle数据库死锁问题,高分悬赏答案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle数据库死锁问题,高分悬赏答案相关的知识,希望对你有一定的参考价值。

系统频繁发生数据库死锁,我将一段死锁trace文件发出来,哪位能给我诊断一下,告诉我是什么原因引起的,不胜感谢!如若解决,额外悬赏100分

*** 2010-07-11 15:36:09.805
*** SERVICE NAMESYS$USERS) 2010-07-11 15:36:09.773
*** SESSION ID527.2) 2010-07-11 15:36:09.773
DEADLOCK DETECTED ( ORA-00060 )
[Transaction Deadlock]
The following deadlock is not an ORACLE error. It is a
deadlock due to user error in the design of an application
or from issuing incorrect ad-hoc SQL. The following
information may aid in determining the deadlock:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TM-0000e380-00000000 26 527 SX SSX 23 530 SX SSX
TM-0000e380-00000000 23 530 SX SSX 26 527 SX SSX
session 527: DID 0001-001A-00000002 session 530: DID 0001-0017-00000002
session 530: DID 0001-0017-00000002 session 527: DID 0001-001A-00000002
Rows waited on:
Session 530: no row
Session 527: no row
Information on the OTHER waiting sessions:
Session 530:
pid=23 serial=5 audsid=5021472 user: 58/MAIFANGL
O/S info: user: , term: , ospid: 1234, machine: alan-PC
program:
Current SQL Statement:
delete from t_user where ID=:1
End of information on OTHER waiting sessions.
Current SQL statement for this session:
delete from t_user where ID=:1
===================================================

各位大侠 望不吝赐教 QQ六八六六六六九六 请注明数据库死锁

典型的资源竞争。
由于update产生的死锁
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
查看数据库alert.log

delete也差不多
参考技术A 从起服务试试;

C语言编程文本保存问题。。高分悬赏

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define MAX 100
typedef struct student

char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
stu;
void main()

stu a[MAX];
int i=0,n=0,k;
FILE *fp;
if((fp=fopen("e:\\student.txt","a+"))==NULL)

printf("open file error!\n");
exit(0);


for(i=0;fread(&a[i],sizeof(stu),1,fp)!=0;i++)
n=i;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n+1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k=n-1;k>=0;k--)
if(strcmp(a[k].num,a[n].num)==0)

rintf("该学生已经存在,请重新输入");
break;


if((fp=fopen("e:\\student.txt","wb"))==NULL)

printf("open file error!\n");
exit(0);


for(i=0;i<n;i++)
fwrite(&a[i],sizeof(a[0]),1,fp);
fclose(fp);

我觉得这个程序是要完成对学生姓名和我成绩的录入吧?如果不是就请当我没有回答。
首先,第一个for函数就有问题。按我的理解,你应该在一对花括号。应该在n=i前加 ,在break后再追加一个 。这样才能实现对多个数据的输入,否则一直执行
for(i=0;fread(&a[i],sizeof(stu),1,fp)!=0;i++) n=i; 至到fread(&a[i],sizeof(stu),1,fp)==0时。再执行下面的语句。还有判断是否此人已经输入了,函数名写错了 rintf ,应该是printf。还有程序还个缺点,此程序还确实一个结束录入的语句,不然要一直录入,直到
fp=fopen("e:\\student.txt","wb")==0时才结束,而且不能正确保存信息。还有最后一个if语句也有错,
fp=fopen("e:\\student.txt","wb")也有问题。此语句应该是为后面输出学生信息,为读做准备,应该改为
fp=fopen("e:\\student.txt","rb")。另外还有个小瑕疵,平均分不一定整数,应该写为float,除的时候应该除3.0。我没有编辑器,修改的不知道到结果怎么样了,目前我还没有发现其他大问题。说句题外话,main函数太复杂,需要简化,你应该多调用函数来实现。实现同样功能的程序,最简单的才是最好的。希望我说的对你有用追问

谢谢。。可以保存了。。。但是出现的是乱码。。。还有for(i=0;fread(&a[i],sizeof(stu),1,fp)!=0;i++) n=i; 这一句好像无法计算文件中总共存有多少个,每次执行都是现显示n=0,还有可是麻烦说下那个结束录入语句要怎样,
0309101010蘗 : W N ? 这是存进去后乱码的情况

追答

#include
#include
#include
#define MAX 100
typedef struct student

char num[10];
int math;
int eng;
int chin;
float ave;
int totle;
stu;
void main()

stu a[MAX];
int i=0,n=0,k,m;
FILE *fp;
if((fp=fopen("e:\\student.txt","wb"))==NULL)

printf("open file error!\n");
exit(0);

printf("请输入要录入信息的人数(小于101):");
scanf("%d",&m);
for(i=0;i0;k--)
if(strcmp(a[k].num,a[n].num)==0)

printf("该学生已经存在,请重新输入");
i-- ;/*用来覆盖原来那个相同的*/
break;


for(i=0;i<n+1;i++)

printf("%-6s%5d%5.1f",a[i].num,a[i].totle,a[i].ave);
printf("\n");

fclose(fp);

我没有运行过,你自己试试吧

参考技术A 先说下错误。
读取,文件是用a+方式打开,这读取数据,因为文件指针在最末的关系,读取出来的数据是空的,所以n永远为0。
其次,在写数据前,没有fclose文件就再fopen一次,这是正确的文件操作方式?
最后,老实说,看你的代码头很痛,不是说代码很难,而是这个格式实在太难看,很多时候,一看到这种混乱的代码,直接看都不看就关掉的。在诸多IDE的今天,写一段格式整齐的代码很难么,不要跟我说你是用windows记事本写代码的。

最最后,下面是整理并修改正确的代码:

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

#ifndef MAX_NUM
#define MAX_NUM 100
#endif

typedef struct student

char num[11];
int math;
int eng;
int chin;
int ave;
int totle;
stu;

void main()

stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n) ;
printf("请输入要添加的信息");
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)

if(strcmp(a[k].num,a[n].num) == 0)

printf("该学生已经存在,请重新输入");
break;


if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)

printf("open file error!\n");
exit(0);

fseek(fp, 0, SEEK_SET);
for(i = 0; i <= n; i++)
fwrite(&a[i], 1, sizeof(a[0]), fp);
fclose(fp);
追问

真的非常感谢。。。。由于还算是初学者还在学习中。。。。会慢慢改进的。。。多谢指导。。。不过那个存进去为什么成绩存进去的是乱码 存进文本的内容如下
0309101201 蘗 X W X  麻烦再指导下哦

追答

因为使用"wb"方式打开文件再写入的原因,如果要不乱码文本,需要修改读写的逻辑,比现在会麻烦很多。要将每个struct的字段按一定的规则读写才行。

本回答被提问者采纳
参考技术B char name[15]; /*姓名*/
float jbgz; /*基本工资*/
float koukuan; /*扣款*/
float yfgz; /*应发工资*/
float shuijin; /*税金*/
float sfgz; /*实发工资*/
struct z1 *prior;/*前驱指针*/
struct z1 *next;/*后继指针*/
SALARY; /*结构体类型名*/
struct z1 *First; /*双链表头指针*/
struct z1 *Last; /*双链表尾指针*/
/******函数原型*********/
void init(); /*初始化*/
void create(); /*创建链表*/
void calc(); /*计算应发工资*/
void delete(); /*删除*/
void search(); /*查找*/
void save(); /*保存文件*/
void load(); /*读取文件*/
void computer(); /*计算所需各种票面张数*/
void insert(); /*插入*/
void append(); /*追加*/
void copy(); /*复制文件*/
void sort(); /*排序*/
void index(); /*索引*/
void total(); /*分类合计*/
void list(); /*显示所有数据*/
void print(SALARY *p); /*输出单条记录*/
void display(); /*随意逐条显示*/
float fax(float x); /*计算税金*/
int menu_select(); /*主菜单*/
/*******主函数开始**********/
main()

int i;
clrscr();
for(;;)

switch(menu_select()) /*调用菜单函数返回一个整数值*/

case 0:init();break; /*初始化*/
case 1:create();break; /*输入数据创建双链表*/
case 2:list();break; /*显示所有数据*/
case 3:display();break; /*单条显示*/
case 4:calc();break; /*计算实发工资*/
case 5:search();break; /*查找职工信息数据*/
case 6:delete();break; /*删除记录*/
case 7:insert();break; /*插入记录*/
case 8:append();break; /*追加记录*/
case 9:save();break; /*保存文件*/
case 10:load(); break; /*读取文件*/
case 11:copy();break; /*复制文件*/
case 12:sort();break; /*按实发工资升序排序*/
case 13:computer();break; /*计算所需票面数*/
case 14:index();break; /*按职工号索引*/
case 15:total();break; /*按部门求合计*/
case 16:exit(0); /*退出*/



/*菜单函数,函数返回值为整型,代表所选的菜单项*/
menu_select()

char *f[]= /*定义菜单字符串数组*/
"**************MENU*************", /*菜单的标题行*/
" 0. init list", /*初始化双链表*/
" 1. Enter list", /*输入数据,创建双链表*/
" 2. List all \n", /*显示所有记录*/
" 3. Display record by step", /*显示单条记录*/
" 4. Calc the salary", /*计算实发工资*/
" 5. Search record on name", /*查找记录*/
" 6. Delete a record", /*删除记录*/
" 7. Insert record to list", /*插入记录*/
" 8. Append record to file", /*追加记录*/
" 9. Save data to the file", /*保存文件*/
" 10. Load data from the file",/*读取文件*/
" 11. Copy the file to new file", /*复制文件*/
" 12. Sort on sfgz", /*排序*/
" 13. Computer ticket number", /*计算所需票面数*/
" 14. Index on number", /*索引*/
" 15. Total on number", /*分类合计*/
" 16. Quit" ; /*退出*/
char s[80];
int i;
int key=0; /*记录所压键值*/
int c=0;
gotoxy(1,25); /*移动光标*/
printf("press any key enter menu......\n");/*压任意键进入主菜单*/
getch();
clrscr(); /*清屏*/
textcolor(YELLOW); /*设置文本颜色为黄色*/
textbackground(BLUE); /*设置背景颜色为兰色*/
gotoxy(10,2);
putch(0xda); /*输出左上角边框┏*/
for(i=1;i<44;i++)
putch(0xc4); /*输出上边框水平线*/
putch(0xbf); /*输出右上角边框 ┓*/
for(i=3;i<22;i++)/*输出左右两边的垂直线*/

gotoxy(10,i);putch(0xb3);
gotoxy(54,i);putch(0xb3);

gotoxy(10,22);putch(0xc0); /*输出左上角边框┗*/
for(i=1;i<44;i++)
putch(0xc4); /*输出下边框水平线*/
putch(0xd9); /*输出右下角边框┛*/
window(11,3,53,21); /* 制作显示菜单的窗口,大小根据菜单条数设计*/
clrscr(); /*清屏*/
for(i=0;i<18;i++)

gotoxy(10,i+1);
cprintf("%s",f[i]); /*输出菜单项数组*/

i=1;
gotoxy(10,2); /*设置默认选项在第一项*/
textbackground(LIGHTGREEN);/*设置背景颜色为浅绿*/
cprintf("%s",f[1]); /*输出菜单项,表示选中*/
gotoxy(10,2); /*移动光标到菜单的第一项*/
while(key!=13) /*所压键不是回车键时*/

while(bioskey(1)==0); /*查询是否压下了一个键*/
key=bioskey(0); /*返回下一个在键盘压下的键*/
key=key&0xff?key&0xff:key>>8; /*对所压的键进行判断*/
gotoxy(10,i+1);
textbackground(BLUE);/*设置背景颜色为蓝色*/
cprintf("%s",f[i]); /*输出菜单项*/
if(key==72) i=i==1?17:i-1; /*如压向上光标键↑,i减1,如已到第一行再上移,则到最后一行*/
if(key==80)i=i==17?1:i+1; /*如压向下光标键↓,i加1,如已到最后一行再下移,则到第一行*/
gotoxy(10,i+1); /*光标移动i的下一项*/
textbackground(LIGHTGREEN); /*将背景颜色设为浅绿*/
cprintf("%s",f[i]); /*输出菜单项*/
c=i-1; /*给代表菜单选项的整数赋值*/

textbackground(BLACK); /*设置背景颜色为黑色*/
window(1,1,80,25); /*恢复原窗口大小*/
return c; /*返回代表菜单选项的整数值*/

/*初始化函数*/
void init()

First=NULL;
Last=NULL;

/*输入数据,创建双链表*/
void create()

int x; /*记录行坐标*/
int i; /*记录输入记录数*/
int flag=0; /*做结束标记*/
float temp; /*定义临时变量*/
SALARY *info,*p; /*定义临时变量*/
if(First!=NULL)
init();/*如果头指针为空,调用初始化函数*/
p=First; /*从头指针开始*/
for(;;)

if(flag==1)
break; /*如果flag=1,结束输入*/
i=0;
x=0; /*确定移动的行坐标*/
clrscr(); /*清屏*/
gotoxy(1,3);
printf("*************gongziguanli*************");/*输出标题*/
gotoxy(1,4);
printf(" --Enter @ end--");/*提示输入@结束*/
gotoxy(1,5);
printf("|------------------------------------|");/*输出表格的起始线*/
gotoxy(1,6);
printf("| no | name | jbgz |");/*输出字段标题,注意空格数*/
for(;;)

gotoxy(1,7+x);
printf("|----------|----------------|--------|");/*输出表格的水平线*/
info=(SALARY *)malloc(sizeof(SALARY));/*申请一个记录空间*/
if(!info)

printf("\nout of memory");/*如没有得到空间,输出内存溢出信息*/
exit(0);/*退出程序*/

info->next=NULL;/*新结点的后继为空*/
info->prior=NULL;/*新结点的前驱为空*/
gotoxy(1,8+x);printf("|"); /*输出数据间的分割线*/
gotoxy(12,8+x);printf("|");
gotoxy(29,8+x);printf("|");
gotoxy(38,8+x);printf("|");
gotoxy(2,8+x);/*光标到输入编号位置*/
inputs(info->no,10);/*输入编号,并验证长度不超过10*/
if(info->no[0]=='@')

flag=1;
break;
/*编号首字符为@结束输入*/
gotoxy(13,8+x); /*光标到输入姓名位置*/
inputs(info->name,14); /*输入姓名,并验证长度不超过14*/
gotoxy(30,8+x); /*光标到输入基本工资位置*/
scanf("%f",&temp); /*输入基本工资到临时变量*/
info->jbgz=temp; /*基本工资赋值*/
info->koukuan=0; /*初始扣款为0,待计算工资时输入*/
info->sfgz=0; /*初始实发工资为0,待计算工资时计算*/
info->shuijin=0; /*初始税金为0,待计算工资时计算*/
info->yfgz=0; /*初始应发工资为0,待计算工资时计算*/
if(p==NULL)/*如果p为空,说明输入的是第一个结点*/

First=Last=info;/*头指针和尾指针*/
First->prior=NULL; /*头指针的前驱是空*/
Last->next=NULL; /*尾指针的后继是空*/

else /*插入的结点不是第一结点,则插入在头结点之前*/

info->next=p;/*新结点的后继指向原来的头结点*/
info->prior=p->prior;/*新结点的前驱指向原来的头结点的前驱*/
p->prior=info;/*原来结点的前驱指向新结点*/

p=info; /*新结点变为p结点,暂时的头结点*/
First=info; /*新结点变为头结点*/
x+=2; /*因为水平线,将光标下移两行*/
gotoxy(1,8+x);
i++; /*输入记录数加1*/
if(i%9==0)
break; /*输入9个记录,换一页输入*/

gotoxy(1,8+x);

printf("|----------|----------------|--------|");/*输出结尾水平线*/

/*字符串输入和验证函数*/
inputs(char *s, int count)

char p[255];
do
scanf("%s",p);/*输入字符串*/
if(strlen(p)>count)printf("\n too long! \n");/*进行长度校验,超过count值重输入*/
while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/

/*显示链表*/
void list()

int i=0,n; /*记录输出行数*/
SALARY *p; /*定义移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
while(i%10==0&&p!=NULL) /*外循环控制换页*/

i=0; /*记录一页的输出行数*/
clrscr(); /*清屏*/
printf("\n\n\n"); /*换行三次*/
printf("*************************************SALARY***********************************\n"); /*输出大标题*/
printf("|nO | name | jbgz | koukuan | yfgz | shuijin | sfgz |\n"); /*输出字段标题*/
printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出水平线*/
while(p!=NULL) /*当p不为空时*/

printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n",
p->no,p->name,p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);
p=p->next; /*指针后移*/
i++; /*输出行数加1 */
if(i%10==0)
break; /*如果满10行,跳出内循环*/

printf("****************************************end***********************************\n"); /*输出本页的结束行*/
printf("Press any key congtinue...\n");
getch(); /*输出一页暂停一下,压任意键继续*/
/*返回到外循环,准备下一页的输出*/

/*单条显示记录*/
void display()

int ch; /*菜单选项字符*/
SALARY *p; /*定义临时指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
if(p==NULL) /*指针为空,即链表为空,返回主函数*/

printf("record is empty!\n");
return;

else

print(p); /*调用输出函数显示头结点信息*/
for(;;) /*循环开始*/

printf("\n\n0. Quit 1. Prior 2. Next 3. First 4.Last \n\n");
/*菜单项Quit退出 Prior前驱 Next后继 First第一条 Last最后一条*/
printf("\nplease select 0~4:"); /*提示输入菜单选项0~4*/
scanf("%d",&ch); /*输入菜单选项0~4*/
if(ch==0) break; /*如果选项为0,退出*/
switch(ch) /*开关语句根据选项字符判断*/

case 1:p=p->prior;if(p==NULL)p=First;break; /*指向前驱,没有前驱指向第一个*/
case 2:p=p->next;if(p==NULL) p=Last;break; /*指向后继,没有后继指向最后一个*/
case 3:p=First;break; /*指向第一个结点*/
case 4:p=Last;break; /*指向最后一个结点*/

print(p); /*调用输出函数显示指针所指结点信息*/



/*输出指针所指结点信息*/
void print(SALARY *p)

if(p) /*如果指针不为空,则显示信息*/

clrscr(); /*清屏*/
printf("\n\n\n"); /*换行*/
printf("************************************SALARY************************************\n"); /*输出标题信息*/
printf("|no | name | jbgz | koukuan| yfgz | shuijin | sfgz |\n"); /*输出字段标题*/
printf("|----------|---------------|---------|---------|---------|---------|---------|\n"); /*输出分割线*/
printf("|%-10s|%-15s|%9.2f|%9.2f|%9.2f|%9.2f|%9.2f|\n", p->no,p->name,
p->jbgz,p->koukuan,p->yfgz,p->shuijin,p->sfgz);/*输出结点信息*/
printf("***************************************end***************************** *******\n"); /*输出结束标记*/


/*计算实发工资*/
void calc()

int x; /*行坐标*/
int i=0; /*记录数*/
float temp; /*临时变量扣款*/
SALARY *p; /*移动指针*/
clrscr(); /*清屏*/
p=First; /*从头指针开始*/
while(p!=NULL) /*当p不为空时,也就是有记录时,外循环控制换页*/

x=0;
clrscr();
gotoxy(1,3);
printf("***************************gongziguanli************************************"); /*输出标题*/
gotoxy(1,5);
printf("|--------------------------------------------------------------------------|");
gotoxy(1,6);/*下面输出字段标题*/
printf("| no | name | jbgz | koukuan | yfgz |shuijin | sfgz |");
while(p!=NULL) /*当p不为空时,也就是有记录时,内循环控制处理9条*/

gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|");
gotoxy(1,8+x);printf("|");
gotoxy(12,8+x);printf("|");
gotoxy(29,8+x);printf("|");
gotoxy(38,8+x);printf("|");
gotoxy(49,8+x);printf("|");
gotoxy(58,8+x);printf("|");
gotoxy(67,8+x);printf("|");
gotoxy(76,8+x);printf("|");
gotoxy(2,8+x);
printf("%-10s",p->no); /*输出编号*/
gotoxy(13,8+x);
printf("%-15s",p->name); /*输出姓名*/
gotoxy(30,8+x);
printf("%.2f",p->jbgz); /*输出基本工资*/
gotoxy(39,8+x);
scanf("%f",&temp); /*输入扣款*/
p->koukuan=temp; /*扣款字段赋值*/
p->yfgz=p->jbgz-p->koukuan; /*计算应发工资=基本工资-扣款*/
gotoxy(50,8+x);
printf("%.2f",p->yfgz); /*输出应发工资*/
gotoxy(59,8+x);
p->shuijin=(p->yfgz-1000)*fax(p->yfgz); /*否则按税率计算税金*/
printf("%.2f",p->shuijin); /*输出税金*/
gotoxy(68,8+x);
p->sfgz=p->yfgz-p->shuijin; /*计算实发工资*/
printf("%-8.2f",p->sfgz); /*输出实发工资*/
x+=2; /*行坐标下移两行*/
i++; /*记录数加1*/
if(i%9==0)break; /*记录数超过9条,跳出内循环*/
p=p->next; /*指针后移,处理下一条*/

gotoxy(1,7+x);
printf("|----------|----------------|--------|----------|--------|--------|--------|\n"); /*输出结束行*/
printf("Press any key congtinue...\n");
getch();


/*根据应发工资,计算税率*/
float fax(float x)

float f1;
if(x<1000)
return 0; /*小于1000,返回0*/
switch((int)(x/1000))

case 1:f1=0.05;break; /*1000~1999,返回0.05*/
case 2:f1=0.1;break; /*2000~2999,返回0.1*/
case 3:f1=0.15;break; /*3000~3999,返回0.15*/
case 4:f1=0.2;break; /*4000~4999,返回0.2*/
default:f1=0.3;break; /*5000以上,返回0.3*/

return f1;

/*计算票面张数*/
void computer()

SALARY *p;
int i=0,a[7]=,t100,t50,t20,t10,t5,t2,t1;/*设置数组和临时变量保存票面张数*/
float t; /*过渡变量,保存当前剩余工资*/
p=First; /*移动指针从头指针开始*/
while(p!=NULL) /*当p不为空时*/

t100=(int)p->sfgz/100; /*计算100元张数*/
a[0]=a[0]+t100; /*累加保存*/
t=p->sfgz-t100*100; /*剩余工资*/
t50=(int)(t/50); /*计算50元张数*/
a[1]=a[1]+t50; /*累加保存*/
t=t-t50*50; /*剩余工资*/
t20=(int)(t/20); /*计算20元张数*/
a[2]=a[2]+t20; /*累加保存*/
t=t-t20*20; /*剩余工资*/
t10=(int)(t/10); /*计算10元张数*/
a[3]=a[3]+t10; /*累加保存*/
t=t-t10*10; /*剩余工资*/
t5=(int)(t/5); /*计算5元张数*/
a[4]=a[4]+t5; /*累加保存*/
t=t-t5*5; /*剩余工资*/
t2=(int)(t/2); /*计算2元张数*/
a[5]=a[5]+t2; /*累加保存*/
t=t-t2*2; /*剩余工资*/
t1=(int)(t); /*计算1元张数*/
a[6]=a[6]+t1; /*累加保存*/
p=p->next; /*指针后移,处理下一条记录*/

clrscr(); /*清屏*/
printf("\n\n\n***********ticket number***************\n"); /*输出标题*/
printf("--100-----50------20-----10-----5------2------1------\n");
/*输出张数标题*/
for(i=0;i<7;i++)
printf("%5d ",a[i]);/*输出所需的张数*/
printf("\n");/*换行*/

/*按编号查找记录*/
SALARY *find(char *no)

SALARY *p; /*定义移动指针*/
p=First; /*从头指针开始*/
while(p) /*当p不为空时*/

if(!strcmp(no,p->no))
return p; /*比较相等,查找成功,返回指针*/
p=p->next; /*不相等指针后移*/

printf("not found\n"); /*没有找到*/
return NULL; /*返回为空指针*/
参考技术C 在第二次打开文件前先关闭。 参考技术D 尾段的
for(i=0;i<n;i++)
改为
for(i=0;i<=n;i++)
试试追问

还是不行

追答

前面统计个数略改了一下 这样就能看到你存的结果了
文件以二进制保存,即数字65用记事本看是A 所以有乱码

后面是完整的程序 多条记录录入 学号转入0结束
#include
#include
#include

#ifndef MAX_NUM
#define MAX_NUM 100
#endif

typedef struct student

char num[11];
int math;
int eng;
int chin;
float ave;
int totle;
stu;

void main()

stu a[MAX_NUM];
int i = 0, n = 0, k = 0;
FILE *fp = fopen("e:\\student.txt","rb+");
clrscr();
printf("学号\t数:\t英:\t语:\t均:\t总:\t\n");
for(n = 0; fp && fread(&a[n], 1, sizeof(stu), fp) != 0; ++n)
printf("%s\t%d\t%d\t%d\t%f\t%d\t\n",
a[n].num,a[n].math,a[n].eng,a[n].chin,a[n].ave,a[n].totle);
printf("*************************************************\n");
if(fp == NULL && (fp = fopen("e:\\student.txt","wb")) == NULL)

printf("open file error!\n");
exit(0);

fseek(fp, 0, SEEK_SET);
printf("请输入要添加的信息");
do
printf("\n请输入第%d个学生信息:\n",n + 1);
printf("学号:\n");
scanf("%s",a[n].num);
if(!strcmp(a[n].num,"0"))break;
printf("math成绩:\n");
scanf("%d",&a[n].math);
printf("english成绩:\n");
scanf("%d",&a[n].eng);
printf("chin成绩:\n");
scanf("%d",&a[n].chin);
a[n].totle=a[n].math+a[n].eng+a[n].chin;
a[n].ave=a[n].totle/3;
for(k = n-1; k >= 0; k--)

if(strcmp(a[k].num,a[n].num) == 0)

printf("该学生已经存在,请重新输入");
break;


/* for(i = 0; i <= n; i++)
fwrite(&a[i], sizeof(a[i]),1 , fp);*/
fwrite(&a[n], sizeof(a[n]),1 , fp);
n++;
while(1);
fclose(fp);


如果一次不能输入多条记录 就把fseek删掉
附英文下运行结果

以上是关于Oracle数据库死锁问题,高分悬赏答案的主要内容,如果未能解决你的问题,请参考以下文章

写个脚本使用perl或shell对比oracle表数据,急啊,高分悬赏!

[高分悬赏] sql 行列转换 请高人指点

oracle简单编程问题,在线等 急急急!大大悬赏

急!【高分悬赏】北交大(单片机实验控制)课的实验一(回答得好有追加) 我只要实验程序和思考问题的答案

关于oracle数据库死锁,请大神进。为啥用java synchronized 关键字解决不了?怎么解决死锁问题?

高分悬赏 求解2道MATLAB编程题目