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

huyangg 2009-05-31 12:40:25
#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;
}
}

在创建文件时,有错,哪位大侠帮我看看,多谢!
...全文
129 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
性能侠客行 2009-05-31
  • 打赏
  • 举报
回复
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;
}
}
scanf("%s",输入的为地址);
而filena 本身为地址. 加入& 变成&filena 指向指针的指针.


huyangg 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 huyangg 的帖子:]
#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; //…
[/Quote]

这个程序是用来 :模拟采用二级目录结构的磁盘文件系统中的文件操作。
中才德创 2009-05-31
  • 打赏
  • 举报
回复
书法不好的源码,难。

64,648

社区成员

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

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