c++程序运行提示:遇到问题需要关闭。我们对此引起的不便表示抱歉。急!急!

放羊大亨 2009-05-31 12:49:05
#include "math.h"
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define L 5 //每个用户最多在磁盘上保存的文件数
#define N 5 //系统同时管理的用户数
#define S 5 //用户最多能打开的文件数
struct UFD //用户文件目录结构
{ char fna[10]; //文件名
char fat; //文件属性 r为只读 w为可读可写
int relong; //记录长度
unsigned fadd; }; //文件地址
struct UOF //用户以打开文件表结构
{ char fna[10];
char fat;
int relong;
char sta[8]; /* 文件状态 cj为创建态 dk为打开态 gb为关闭态 */
unsigned read; // 记录读指针
unsigned write; }; // 记录写指针
struct MFD //主文件目录结构
{ char userna[8]; //用户名
struct UFD *ufd[L]; //指向用户文件目录
struct UOF *uof[S]; //指向打开文件目录
}my[N]={{"lwb",NULL,NULL}, //初始化文件目录表
{"zhp",NULL,NULL},
{"lbf",NULL,NULL},
{"mnb",NULL,NULL},
{"zhj",NULL,NULL}};
int n=0; //记录当前用户
unsigned size; //记录文件记录长度
char atr; //记录文件属性
int screen() /* 操作选择菜单 */
{ int i;
printf(" 文件操作\n\n");
printf("1.建立文件 2.打开文件\n");
printf("3.关闭文件 4.读取文件\n");
printf("5.写文件 6.撤消文件\n");
printf(" 7.退出\n");
printf(" 输入你的选择:");
scanf("%d",&i);
return i;
}
void create(char *fna,unsigned m,char a) // 建立文件函数
{ int i,j;
for(i=0;i<L;i++)
{ if(strcmp(my[n].ufd[i]->fna,fna)==0) //文件唯一性检查
{ printf("\n同名文件不能建立!"); return; } }
j=5;
a=rand(); //模拟找到的磁盘空闲块
strcpy(my[n].uof[j]->fna,fna); //登记到打开文件目录
strcpy(my[n].ufd[j]->fna,fna); //登记到用户文件目录
my[n].ufd[j]->relong=my[n].uof[j]->relong=m;
my[n].ufd[j]->fat=my[n].uof[j]->fat=a;
my[n].ufd[j]->fadd=a;
strcpy(my[n].uof[j]->sta,"cj");
my[n].uof[j]->write=j;
printf("\n文件建立成功!");
}
void open(char *fna,char a) //打开文件函数
{ int i,h;
for(i=0;i<L;i++)
{ if(strcmp(my[n].ufd[i]->fna,fna)!=0) ; //查用户文件目录
else { h=i;break; } }
if(i>=L) { printf("文件不存在不能打开!\n"); return; }
for(i=0;i<S;i++) { if(strcmp(my[n].uof[i]->fna,fna)==0) break; }
if(strcmp(my[n].uof[i]->sta,"cj")==0) printf("正在建立不能打开!\n");
else { printf("文件已打开!\n"); return; }
if(i>=S)
{ if(my[n].uof[i]->fat!=a) //检查文件操作属性
{ printf("操作不合法,不能打开!\n"); return; }
strcpy(my[n].uof[i]->fna,fna); //登记到打开文件表
my[n].uof[i]->relong=my[n].ufd[h]->relong;
my[n].uof[i]->fat=a;
my[n].uof[i]->read=my[n].uof[i]->write=my[n].ufd[h]->fadd;
printf("打开文件成功!"); }
}
void read(char *fna,int l) //读文件操作
{ int k;
for (int i=0;i<S;i++) //检查文件是否打开
{ if (strcmp(my[n].uof[i]->fna,fna)!=0)
{ printf("\n文件未打开,不能读!"); return;}
else k=i;}
printf("%d\n",my[n].uof[k]->read);
my[n].uof[k]->read=+l;
printf("\n读文件成功!");
}
void write(char *fna,int r) //写文件操作
{ int k;
char g;
for(int i=0;i<S;i++) //检查文件是否打开
{ if(strcmp(my[n].uof[i]->fna,fna)!=0)
{printf("\n文件尚未建立或打开,不能写!"); return;}
else k=i;}
if (strcmp(my[n].uof[k]->sta,"cj")==0) //检查文件是否为建立状态
{ printf("%d\n",my[n].uof[k]->write); //输出写指针模拟写文件
my[n].uof[k]->write=+my[n].uof[k]->relong+r; //修改写指针
printf("\n写文件成功!"); return;}
if ( my[n].uof[k]->fat=='r')
{ printf("\n操作不合法,不能写!"); return;}
else { printf("\n是否顺序修改?(Y/N)"); scanf("%c",&g); //选择修改方式
if (g=='y'||g=='Y')
{ my[n].uof[k]->write=+my[n].uof[k]->relong;} //顺序修改
else
printf("%d\n",my[n].uof[k]->write); } //显示写指针模拟随机修改
printf("\n写文件成功!");
}
void close(char *fna) //关闭文件操作
{ int i,k,f;
for(i=0;i<S;i++)
if((strcmp(my[n].uof[i]->fna,fna))==0)
{ k=i; break; } //找文件在打开文件目录中的登记位置
if(((strcmp(my[n].uof[k]->sta,"cj"))==0)
||((f=strcmp(my[n].uof[k]->sta,"dk"))==0)) //检查文件状态
{ my[n].uof[k]->read=my[n].uof[k]->write=0; //清空登记
strcpy(my[n].uof[k]->fna," ");
strcpy(my[n].uof[k]->sta," ");
my[n].uof[k]->relong=0;
printf("\n文件关闭成功!"); }
if(f!=0) printf("\n文件已关闭!");
}
void dele(char *fna) //撤消文件操作
{ int i,k;
for(i=0;i<N;i++)
if(strcmp(my[n].ufd[i]->fna,fna)!=0) //检查用户文件目录是否有要关闭的文件
{ printf("\n文件已撤消!"); return; }
for(i=0;i<S;i++)
if(strcmp(my[n].uof[i]->fna,fna)==0) //清空打开文件目录中的登记
{ strcpy(my[n].uof[i]->fna," ");
strcpy(my[n].uof[i]->sta," ");
k=i; break; }
my[n].ufd[k]->fadd=0; //清空用户文件目录中的登记
strcpy(my[n].ufd[k]->fna," ");
printf("\n文件已撤消!");
}
void main()
{ char userna[8],filena[10];
int i,c,flag,record;
while(1)
{ while(1)
{ printf("\n输入用户名:"); scanf("%s",&userna);
for(i=0;i<N;i++)
{ if((flag=strcmp(userna,my[i].userna))==0) //检查用户合法性
{ c=screen(); n=i; break;} }
if(flag!=0) { printf("\n无此用户!"); getchar(); }
else break; }
switch(c)
{ case 1: { printf("\n输入文件名:"); scanf("%s",&filena);
printf("\n输入记录长度:"); scanf("%d",&size); getchar();
printf("\n输入文件属性:"); scanf("%c",&atr);
create(filena,size,atr); } break;
case 2: { printf("\n输入打开文件名:"); scanf("%s",&filena); getchar();
printf("输入操作类型:"); scanf("%c",&atr);
open(filena,atr); } break;
case 3: { printf("\n输入要关闭文件名:"); scanf("%s",&filena);
close(filena); } break;
case 4: { printf("\n请输入文件名及读长度:"); scanf("%d",&size);
read(filena,size); } break;
case 5: { printf("\n请输入文件名:"); scanf("%s",&filena);
printf("\n请输入记录号:"); scanf("%d",&record); getchar();
write(filena,record); } break;
case 6: { printf("\n输入要撤消文件名:"); scanf("%s",&filena);
dele(filena); } break;
case 7: exit(0);
default: printf("输入命令错!");
}
continue;
}
}

这个程序是用来 :模拟采用二级目录结构的磁盘文件系统中的文件操作。

有错,哪位大侠帮我看看,多谢!
...全文
702 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
pingpo 2009-05-31
  • 打赏
  • 举报
回复
有错?
就这么简单?

能否描述清楚点。
goodname 2009-05-31
  • 打赏
  • 举报
回复
另外你的临时改大点,因为你的
printf("\n同名文件不能建立!"); return; } }
j=5;
a=rand(); //模拟找到的磁盘空闲块
strcpy(my[n].uof[j]->fna,fna);

这里你使用了uof[5]超出了预定义的数组元素的范围


#define S 6

void main()
{ char userna[8],filena[10];
int i,c,flag,record;

int m,n;

for(m=0;m <N;m++)
{
for(n=0;n <L;n++)
{
my[m].ufd[n] = (struct UFD *)calloc(1,sizeof(struct UFD));//顺便初始化了

}
for(n=0;n <S;n++)
{
my[m].uof[n] = (struct UOF *)calloc(1,sizeof(struct UOF));
}
}



while(1)
{ while(1)
{ printf("\n输入用户名:"); scanf("%s",&userna);
for(i=0;i <N;i++)
{ if((flag=strcmp(userna,my[i].userna))==0) //检查用户合法性
{ c=screen(); n=i; break;} }
if(flag!=0) { printf("\n无此用户!"); getchar(); }
else break; }
switch(c)
{ case 1: { printf("\n输入文件名:"); scanf("%s",&filena);
printf("\n输入记录长度:"); scanf("%d",&size); getchar();
printf("\n输入文件属性:"); scanf("%c",&atr);
create(filena,size,atr); } break;
case 2: { printf("\n输入打开文件名:"); scanf("%s",&filena); getchar();
printf("输入操作类型:"); scanf("%c",&atr);
open(filena,atr); } break;
case 3: { printf("\n输入要关闭文件名:"); scanf("%s",&filena);
close(filena); } break;
case 4: { printf("\n请输入文件名及读长度:"); scanf("%d",&size);
read(filena,size); } break;
case 5: { printf("\n请输入文件名:"); scanf("%s",&filena);
printf("\n请输入记录号:"); scanf("%d",&record); getchar();
write(filena,record); } break;
case 6: { printf("\n输入要撤消文件名:"); scanf("%s",&filena);
dele(filena); } break;
case 7: exit(0);
default: printf("输入命令错!");
}
continue;
}


for(m=0;m <N;m++)
{
for(n=0;n <L;n++)
{
free(my[m].ufd[n]);

}
for(n=0;n <S;n++)
{
free(my[m].uof[n]);
}
}
}
放羊大亨 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 goodname 的回复:]
算了还是明确提示吧
在main初始化的时候应该
int i,j;

for(i=0;i <N;i++)
{
for(j=0;j <L;j++)
{
my[i].ufd[j] = (struct UFD *)calloc(1,sizeof(struct UFD));//顺便初始化了

}
for(j=0;j <S;j++)
{
my[i].uof[j] = (struct UOF *)calloc(1,sizeof(struct UOF));
}
}

最后还需要释放掉就不写明了

以上代码未调试,可能有手写错误。
[/Quote]

掌柜的,要不你帮我该好,发一下让我试试,我c++不熟,多谢!
NirvanaVirus 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 huyangg 的回复:]
引用 3 楼 NirvanaVirus 的回复:
“遇到问题需要关闭。我们对此引起的不便表示抱歉。”

如果楼主使用的是“C-Free”的话,出现这种错误一般来讲可能是“段错误”导致的,例如数组越界、野指针或空指针异常都会这样的。


我是在VC上运行的,“数组越界、野指针或空指针异常” ,我检查不出来,帮我看看,谢谢!

[/Quote]

我没用过“VC”,现在的机器上也没有。不如你看下6,8,9,10楼的回答吧,参考一下他们的建议。抱歉~
goodname 2009-05-31
  • 打赏
  • 举报
回复
算了还是明确提示吧
在main初始化的时候应该
int i,j;

for(i=0;i<N;i++)
{
for(j=0;j<L;j++)
{
my[i].ufd[j] = (struct UFD *)calloc(1,sizeof(struct UFD));//顺便初始化了

}
for(j=0;j<S;j++)
{
my[i].uof[j] = (struct UOF *)calloc(1,sizeof(struct UOF));
}
}

最后还需要释放掉就不写明了

以上代码未调试,可能有手写错误。
放羊大亨 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 huyangg 的回复:]
引用 2 楼 chenzhp 的回复:
我在dev c++上面运行很正常啊


运行后,创建文件时有错
[/Quote]

用户名在初始化文件目录表这里

my[N]={{"lwb",NULL,NULL}, //初始化文件目录表
{"zhp",NULL,NULL},
{"lbf",NULL,NULL},
{"mnb",NULL,NULL},
{"zhj",NULL,NULL}};
goodname 2009-05-31
  • 打赏
  • 举报
回复
你的ufd和uof都是指向结构的指针,你得需要为他们开辟空间
放羊大亨 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenzhp 的回复:]
我在dev c++上面运行很正常啊
[/Quote]

运行后,创建文件时有错
lingyin55 2009-05-31
  • 打赏
  • 举报
回复
vc6吗?如果是就先换个编译器试试。
提示“遇到问题需要关闭。我们对此引起的不便表示抱歉。”这种的可能是vc6的问题

[Quote=引用 5 楼 huyangg 的回复:]
引用 2 楼 chenzhp 的回复:
我在dev c++上面运行很正常啊


我是在VC上运行的,“数组越界、野指针或空指针异常” ,我检查不出来,帮我看看,谢谢!
[/Quote]
放羊大亨 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 chenzhp 的回复:]
我在dev c++上面运行很正常啊
[/Quote]

我是在VC上运行的,“数组越界、野指针或空指针异常” ,我检查不出来,帮我看看,谢谢!
放羊大亨 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 NirvanaVirus 的回复:]
“遇到问题需要关闭。我们对此引起的不便表示抱歉。”

如果楼主使用的是“C-Free”的话,出现这种错误一般来讲可能是“段错误”导致的,例如数组越界、野指针或空指针异常都会这样的。
[/Quote]

我是在VC上运行的,“数组越界、野指针或空指针异常” ,我检查不出来,帮我看看,谢谢!
NirvanaVirus 2009-05-31
  • 打赏
  • 举报
回复
“遇到问题需要关闭。我们对此引起的不便表示抱歉。”

如果楼主使用的是“C-Free”的话,出现这种错误一般来讲可能是“段错误”导致的,例如数组越界、野指针或空指针异常都会这样的。
chenzhp 2009-05-31
  • 打赏
  • 举报
回复
我在dev c++上面运行很正常啊

65,190

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧