夏目灬 发表于 2019-12-18 15:11:25

我代码出问题了,( missing ';' before 'type')求大佬看看。不难的,

#include<stdio.h>
#include <stdlib.h>
#include<time.h>
#include <string.h>
#define MAX_FILE10         //最大文件个数
#define FILE 1               //结点代表为文件
#define FOLDER 0             //结点代表为文件夹
               
typedef struct FileNode{
        char name;                          //文件名称
        char path;            //文件路径
        time_t create_t;                  //创建时间
        int status;                                        //文件属性
        struct FileNode *child,*brother;         //孩子节点和兄弟节点
}FileNode,*File;                // 结点别名,指向结点的指针别名

File root;                         //根文件
File current;                                        //当前文件
File p;                            //文件的指针

File path;                      //待使用的工具结构体
File T;

int type;                     //新建文件类型
int symbol;
char com;
char fircom;            //第一级命令
char seccom;               //第二级命令

//系统初始化
void Init(){
        root=(FileNode *)malloc(sizeof(FileNode));
        current=(FileNode *)malloc(sizeof(FileNode));
        path=(FileNode *)malloc(sizeof(FileNode));
        T=(FileNode *)malloc(sizeof(FileNode));        //root、current、path、T申请内存空间。
        strcpy(root->name,"ROOT");
        strcpy(root->path,"ROOT");//初始化ROOT根目录路径
        root->create_t=time(NULL);
        root->status=0;
        root->child=NULL;
        root->brother=NULL;
}


//变量直接赋值函数
void Add(File *a,File *b)   
{
        (*a)->create_t=(*b)->create_t;
        (*a)->child=(*b)->child;
        strcpy((*a)->name,(*b)->name);
        (*a)->brother=(*b)->brother;
        (*a)->status=(*b)->status;
        strcpy((*a)->path,(*b)->path);
}

//查找目标文件工具
void Research(File F)      
{                            //遍历当前节点的所有子孙节点找到目标节点
if(F==NULL)                //判断当前结点是否为NULL
                return ;            
if(strcmp(F->path,path->path)==0)//判断是否为目标文件   
        {
                Add(&current,&F);
                p=F;               //把当前文件改为目标文件
                symbol=0;               //设置寻找结果标志
        }
if(symbol==1)
       {
                Research(F->child); //递归函数
                Research(F->brother);
       }
        return ;
}

//文件|文件夹切换
void Cd()
{
        if(strcmp(seccom,"\\")==0)          //返回根文件
        {            
                if(strcmp(p->path,"ROOT")==0)    //如果当前文件在Root不做反应
                {
                        return ;
                }
                p=root;                                                        //在任意路径下切换回根路径 ROOT
                Add(&current,&p);
        }
        else if(strcmp(seccom,"..")==0)   //切换到当前路径的上级文件夹
        {
                if(strcmp(current->path,"ROOT")==0) //如果当前文件在Root不做反应
                {
                        return ;
                }
                else
                {
                        strcpy(seccom,current->path);   //当前文件不在根文件
                        int a=strlen(seccom);       //从当前文件的path字符串中截取双亲文件的path,然后从根文件向下寻找
                        char * find=strrchr(seccom,'\\');   
                        int b=strlen(find);                  
                        int c=a-b;
                        char d="0";
                        strncpy(d,seccom,c);
                        strcpy(path->path,d);   //得到双亲文件的path
                        symbol=1;               //初始化寻找结果标志
                        Research(root);                   //从root开始查找
                }
        }
        else
        {
                symbol=1;                  //初始化寻找结果标志
                Add(&T,&current);
                Add(&path,&current);
                strcat(path->path,"\\");       
                strcat(path->path,seccom);
                Research(T);            //查找目标文件工具
                if(symbol==1)
                        printf("路径不存在或者错误!!!\n");
        }
       
}

//遍历文件
void Traverse(File F)               
{
        printf("%s",F->name);   //输出名称
        if(F->status==1)                //输出文件类型
                printf(" FILE");
        else
                printf(" FOLDER   ");
        time (&F->create_t);          //输出时间
        printf("创建日期:%s",asctime(gmtime(&F->create_t)));
        if(F->brother!=NULL)
                Traverse(F->brother);
        return ;
}

//列出当前路径下的全部文件夹和文件
void Dir()                     
{
                if(p->child!=NULL)   //是否有子节点且不是文件
                {
                        Traverse(p->child);
                }               
}

//新建文件夹\文件
void AddFile(File *New)         
{
                char *a=NULL;            
                a=(char*)malloc(100);
                strcpy(a,current->path);      //制作新文件的path
                strcat(a,"\\");
                strcat(a,seccom);
                *New=(File)malloc(sizeof(FileNode));
                //New=new FileNode;
                strcpy((*New)->name,seccom); //新建文件的name
                strcpy((*New)->path,a);       //新建文件的path
                (*New)->create_t=time(NULL); //新建文件的time
                (*New)->status=type;         //新建文件的类型
                (*New)->child=NULL;
                (*New)->brother=NULL;
}


void NewFile()
{
        if(p->status==1)                //判断文件类型
        {
                printf("这是一个文件!\n");
                return;
        }
        if(p->child!=NULL)   //判断新建的文件是否存在
        {
                if(strcmp(p->child->name,seccom)==0)    //判断新建的第一个子文件是否和新建文件同名
                {
                        printf("文件|文件夹已存在!\n");
                        return ;
                }
                p=p->child;          //把当前文件改为目标文件
                while(!((p->brother==NULL)||(strcmp(p->brother->name,seccom)==0)))//判断当前文件的下一个兄弟文件是否和新建文件同名
                        p=p->brother;
                if(p->brother!=NULL)//判断上一个结束原因
                {
                        Add(&current,&p);
                        strcpy(seccom,"..");//如果存在同名文件,返回主函数,并且调整当前文件指针指向
                        Cd();
                        printf("文件|文件夹已存在!!\n");
                        return ;
                }
                else
                {
                        Add(&current,&p);
                        strcpy(com,seccom);
                        strcpy(seccom,".."); //不存在同名文件夹,调整当前文件指针指向
                        Cd();
                        strcpy(seccom,com);
                }
        }
        if(p->child!=NULL)   //判断是否有子文件
        {
                p=p->child;
                while(p->brother!=NULL)
                        p=p->brother;
                AddFile(&(p->brother));
                Add(&current,&p);
                strcpy(seccom,"..");
                Cd();
        }
        else
        {
                AddFile(&(p->child));
                Add(&current,&p);
                printf("文件|文件夹");
                printf("创建成功\n");
        }
}

void Delete()                            //删除文件\文件夹
{
        if(strcmp(p->child->name,seccom)==0)//判断子文件是否为待删除文件
        {
                p->child=p->child->brother;
                return ;
        }
        p=p->child;               //调整当前文件指针指向
        while(!((p->brother==NULL)||(strcmp(p->brother->name,seccom)==0)))//判断当前文件的下一个兄弟文件是否为待删除命令
                        p=p->brother;      //调整当前文件指针指向
        if(p->brother==NULL)
        {
          Add(&current,&p);
                strcpy(seccom,"..");
                Cd();
                return ;
        }
        p->brother=p->brother->brother;
        Add(&current,&p);
        strcpy(seccom,"..");      
        Cd();                                                        //删除之后返回到双亲文件
}
//退出系统
void Exit()            
{
                printf("谢谢使用!\n");
                exit(0);
}
int main()
{
        Init();        //系统初始化                  
    printf("*****欢迎使用本系统****\n");
        printf("使用说明:\n");
    printf("1.在当前路径下新建文件夹:md\n");
    printf("2.在当前路径下新建文件:mf\n");
    printf("3.在任意路径下切换回根路径 ROOT:cd \\\n");
    printf("4.列出当前路径下的全部文件夹和文件:dir\n");
        printf("5.切换到当前路径下的某文件夹:cd 文件夹|文件\n");
        printf("6.切换到当前路径的上级文件夹:cd ..\n");
        printf("7.删除当前路径下的某文件或文件夹(及其下所有文件夹及文件):del\n");
        printf("8.退出系统:exit\n");
        Add(&current,&root);       
        p=root;
        while(1)
        {
                printf("%s> ",current->path);   //输出当前位置
                scanf("%s",fircom);//cin>>fircom;   //获得第一级命令
            if(!strcmp(fircom,"exit"))
                {
                        Exit();               //退出系统
                }
                else if(!strcmp(fircom,"dir"))
                {
                        Dir();      //列出当前文件夹的全部文件和详细信息
                        fflush(stdin);//cin.sync();
                }

                else if(!strcmp(fircom,"cd")||!strcmp(fircom,"md")||!strcmp(fircom,"mf")||!strcmp(fircom,"del"))       
                {
                        scanf("%s",seccom);//cin>>seccom;
                        if(!strcmp(fircom,"cd"))   //切换到当前路径下的某文件夹
                        {
                                Cd();
                        }
                        else if(!strcmp(fircom,"md"))   //新建文件夹
                        {
                                type=0;
                                NewFile();
                        }
                        else if(!strcmp(fircom,"mf"))   //新建文件
                        {
                                type=1;
                                NewFile();
                        }
                        else if(!strcmp(fircom,"del"))   //删除文件\文件夹
                        {
                                Delete();
                        }
                }
                else
                {
                        fflush(stdin);            //清除缓冲区未读取信息
                }
        }       
        return 0;
}

夏目灬 发表于 2019-12-18 15:14:09

复制运行一下就行,大佬帮帮我。

Tec 发表于 2019-12-18 15:24:07

运行了,什么问题都没有啊

夏目灬 发表于 2019-12-18 16:12:37

Tec 发表于 2019-12-18 15:24
运行了,什么问题都没有啊

我用的c++显示7个错误
E:\cc\1.c(96) : error C2143: syntax error : missing ';' before 'type'
E:\cc\1.c(97) : error C2143: syntax error : missing ';' before 'type'
E:\cc\1.c(98) : error C2143: syntax error : missing ';' before 'type'
E:\cc\1.c(99) : error C2143: syntax error : missing ';' before 'type'
E:\cc\1.c(100) : error C2143: syntax error : missing ';' before 'type'
E:\cc\1.c(101) : error C2065: 'd' : undeclared identifier
E:\cc\1.c(101) : warning C4047: 'function' : 'char *' differs in levels of indirection from 'int '
E:\cc\1.c(101) : warning C4024: 'strncpy' : different types for formal and actual parameter 1
E:\cc\1.c(101) : error C2065: 'c' : undeclared identifier
E:\cc\1.c(104) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'int '
E:\cc\1.c(104) : warning C4024: 'strcpy' : different types for formal and actual parameter 2
Error executing cl.exe.

1.obj - 7 error(s), 4 warning(s)

Tec 发表于 2019-12-18 16:16:20

本帖最后由 Tec 于 2019-12-18 16:17 编辑

用的vs2015

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include <stdlib.h>
#include<time.h>
#include <string.h>
#define MAX_FILE10         //最大文件个数
#define FILE 1               //结点代表为文件
#define FOLDER 0             //结点代表为文件夹

typedef struct FileNode {
        char name;                            //文件名称
        char path;            //文件路径
        time_t create_t;                  //创建时间
        int status;                                        //文件属性
        struct FileNode *child, *brother;         //孩子节点和兄弟节点
}FileNode, *File;                // 结点别名,指向结点的指针别名

File root;                         //根文件
File current;                                        //当前文件
File p;                            //文件的指针

File path;                      //待使用的工具结构体
File T;

int type;                     //新建文件类型
int symbol;
char com;
char fircom;            //第一级命令
char seccom;               //第二级命令

                                                           //系统初始化
void Init() {
        root = (FileNode *)malloc(sizeof(FileNode));
        current = (FileNode *)malloc(sizeof(FileNode));
        path = (FileNode *)malloc(sizeof(FileNode));
        T = (FileNode *)malloc(sizeof(FileNode));      //root、current、path、T申请内存空间。
        strcpy(root->name, "ROOT");
        strcpy(root->path, "ROOT");//初始化ROOT根目录路径
        root->create_t = time(NULL);
        root->status = 0;
        root->child = NULL;
        root->brother = NULL;
}


//变量直接赋值函数
void Add(File *a, File *b)
{
        (*a)->create_t = (*b)->create_t;
        (*a)->child = (*b)->child;
        strcpy((*a)->name, (*b)->name);
        (*a)->brother = (*b)->brother;
        (*a)->status = (*b)->status;
        strcpy((*a)->path, (*b)->path);
}

//查找目标文件工具
void Research(File F)
{                            //遍历当前节点的所有子孙节点找到目标节点
        if (F == NULL)                //判断当前结点是否为NULL
                return;
        if (strcmp(F->path, path->path) == 0)//判断是否为目标文件   
        {
                Add(&current, &F);
                p = F;               //把当前文件改为目标文件
                symbol = 0;               //设置寻找结果标志
        }
        if (symbol == 1)
        {
                Research(F->child); //递归函数
                Research(F->brother);
        }
        return;
}

//文件|文件夹切换
void Cd()
{
        if (strcmp(seccom, "\\") == 0)          //返回根文件
        {
                if (strcmp(p->path, "ROOT") == 0)    //如果当前文件在Root不做反应
                {
                        return;
                }
                p = root;                                                      //在任意路径下切换回根路径 ROOT
                Add(&current, &p);
        }
        else if (strcmp(seccom, "..") == 0)   //切换到当前路径的上级文件夹
        {
                if (strcmp(current->path, "ROOT") == 0) //如果当前文件在Root不做反应
                {
                        return;
                }
                else
                {
                        strcpy(seccom, current->path);   //当前文件不在根文件
                        int a = strlen(seccom);       //从当前文件的path字符串中截取双亲文件的path,然后从根文件向下寻找
                        char * find = strrchr(seccom, '\\');
                        int b = strlen(find);
                        int c = a - b;
                        char d = "0";
                        strncpy(d, seccom, c);
                        strcpy(path->path, d);   //得到双亲文件的path
                        symbol = 1;               //初始化寻找结果标志
                        Research(root);                   //从root开始查找
                }
        }
        else
        {
                symbol = 1;                  //初始化寻找结果标志
                Add(&T, &current);
                Add(&path, &current);
                strcat(path->path, "\\");
                strcat(path->path, seccom);
                Research(T);            //查找目标文件工具
                if (symbol == 1)
                        printf("路径不存在或者错误!!!\n");
        }

}

//遍历文件
void Traverse(File F)
{
        printf("%s", F->name);   //输出名称
        if (F->status == 1)                //输出文件类型
                printf(" FILE");
        else
                printf(" FOLDER   ");
        time(&F->create_t);          //输出时间
        printf("创建日期:%s", asctime(gmtime(&F->create_t)));
        if (F->brother != NULL)
                Traverse(F->brother);
        return;
}

//列出当前路径下的全部文件夹和文件
void Dir()
{
        if (p->child != NULL)   //是否有子节点且不是文件
        {
                Traverse(p->child);
        }
}

//新建文件夹\文件
void AddFile(File *New)
{
        char *a = NULL;
        a = (char*)malloc(100);
        strcpy(a, current->path);      //制作新文件的path
        strcat(a, "\\");
        strcat(a, seccom);
        *New = (File)malloc(sizeof(FileNode));
        //New=new FileNode;
        strcpy((*New)->name, seccom); //新建文件的name
        strcpy((*New)->path, a);       //新建文件的path
        (*New)->create_t = time(NULL); //新建文件的time
        (*New)->status = type;         //新建文件的类型
        (*New)->child = NULL;
        (*New)->brother = NULL;
}


void NewFile()
{
        if (p->status == 1)                //判断文件类型
        {
                printf("这是一个文件!\n");
                return;
        }
        if (p->child != NULL)   //判断新建的文件是否存在
        {
                if (strcmp(p->child->name, seccom) == 0)    //判断新建的第一个子文件是否和新建文件同名
                {
                        printf("文件|文件夹已存在!\n");
                        return;
                }
                p = p->child;          //把当前文件改为目标文件
                while (!((p->brother == NULL) || (strcmp(p->brother->name, seccom) == 0)))//判断当前文件的下一个兄弟文件是否和新建文件同名
                        p = p->brother;
                if (p->brother != NULL)//判断上一个结束原因
                {
                        Add(&current, &p);
                        strcpy(seccom, "..");//如果存在同名文件,返回主函数,并且调整当前文件指针指向
                        Cd();
                        printf("文件|文件夹已存在!!\n");
                        return;
                }
                else
                {
                        Add(&current, &p);
                        strcpy(com, seccom);
                        strcpy(seccom, ".."); //不存在同名文件夹,调整当前文件指针指向
                        Cd();
                        strcpy(seccom, com);
                }
        }
        if (p->child != NULL)   //判断是否有子文件
        {
                p = p->child;
                while (p->brother != NULL)
                        p = p->brother;
                AddFile(&(p->brother));
                Add(&current, &p);
                strcpy(seccom, "..");
                Cd();
        }
        else
        {
                AddFile(&(p->child));
                Add(&current, &p);
                printf("文件|文件夹");
                printf("创建成功\n");
        }
}

void Delete()                            //删除文件\文件夹
{
        if (strcmp(p->child->name, seccom) == 0)//判断子文件是否为待删除文件
        {
                p->child = p->child->brother;
                return;
        }
        p = p->child;               //调整当前文件指针指向
        while (!((p->brother == NULL) || (strcmp(p->brother->name, seccom) == 0)))//判断当前文件的下一个兄弟文件是否为待删除命令
                p = p->brother;      //调整当前文件指针指向
        if (p->brother == NULL)
        {
                Add(&current, &p);
                strcpy(seccom, "..");
                Cd();
                return;
        }
        p->brother = p->brother->brother;
        Add(&current, &p);
        strcpy(seccom, "..");
        Cd();                                                      //删除之后返回到双亲文件
}
//退出系统
void Exit()
{
        printf("谢谢使用!\n");
        exit(0);
}
int main()
{
        Init();      //系统初始化                  
        printf("*****欢迎使用本系统****\n");
        printf("使用说明:\n");
        printf("1.在当前路径下新建文件夹:md\n");
        printf("2.在当前路径下新建文件:mf\n");
        printf("3.在任意路径下切换回根路径 ROOT:cd \\\n");
        printf("4.列出当前路径下的全部文件夹和文件:dir\n");
        printf("5.切换到当前路径下的某文件夹:cd 文件夹|文件\n");
        printf("6.切换到当前路径的上级文件夹:cd ..\n");
        printf("7.删除当前路径下的某文件或文件夹(及其下所有文件夹及文件):del\n");
        printf("8.退出系统:exit\n");
        Add(&current, &root);
        p = root;
        while (1)
        {
                printf("%s> ", current->path);   //输出当前位置
                scanf("%s", fircom);//cin>>fircom;   //获得第一级命令
                if (!strcmp(fircom, "exit"))
                {
                        Exit();               //退出系统
                }
                else if (!strcmp(fircom, "dir"))
                {
                        Dir();      //列出当前文件夹的全部文件和详细信息
                        fflush(stdin);//cin.sync();
                }

                else if (!strcmp(fircom, "cd") || !strcmp(fircom, "md") || !strcmp(fircom, "mf") || !strcmp(fircom, "del"))
                {
                        scanf("%s", seccom);//cin>>seccom;
                        if (!strcmp(fircom, "cd"))   //切换到当前路径下的某文件夹
                        {
                                Cd();
                        }
                        else if (!strcmp(fircom, "md"))   //新建文件夹
                        {
                                type = 0;
                                NewFile();
                        }
                        else if (!strcmp(fircom, "mf"))   //新建文件
                        {
                                type = 1;
                                NewFile();
                        }
                        else if (!strcmp(fircom, "del"))   //删除文件\文件夹
                        {
                                Delete();
                        }
                }
                else
                {
                        fflush(stdin);            //清除缓冲区未读取信息
                }
        }
        return 0;
}

夏目灬 发表于 2019-12-18 16:21:20

好奇怪啊{:10_266:}   为什么你的可以运行你复制你的代码错误反而变多了

{:9_220:}
--------------------Configuration: 1 - Win32 Debug--------------------
Compiling...
1.c
E:\cc\1.c(80) : error C2001: newline in constant
E:\cc\1.c(81) : error C2143: syntax error : missing ')' before '{'
E:\cc\1.c(86) : error C2040: 'p' : 'int ' differs in levels of indirection from 'struct FileNode *'
E:\cc\1.c(86) : error C2099: initializer is not a constant
E:\cc\1.c(87) : error C2143: syntax error : missing ')' before '&'
E:\cc\1.c(87) : error C2143: syntax error : missing '{' before '&'
E:\cc\1.c(87) : error C2059: syntax error : '&'
E:\cc\1.c(87) : error C2059: syntax error : ')'
E:\cc\1.c(88) : error C2059: syntax error : '}'
E:\cc\1.c(109) : error C2059: syntax error : 'else'
E:\cc\1.c(114) : error C2001: newline in constant
E:\cc\1.c(121) : error C2059: syntax error : '}'
E:\cc\1.c(143) : warning C4013: 'Traverse' undefined; assuming extern returning int
E:\cc\1.c(153) : error C2001: newline in constant
E:\cc\1.c(154) : error C2146: syntax error : missing ')' before identifier 'strcat'
Error executing cl.exe.

1.obj - 14 error(s), 1 warning(s)

夏目灬 发表于 2019-12-18 16:25:10

Tec 发表于 2019-12-18 16:16
用的vs2015

我只能下一个vs2015嘛。。。Visual C++ 6.0怎么用不了。。。

Tec 发表于 2019-12-18 16:28:41

不清楚你那边的具体情况,我也不知道。。

夏目灬 发表于 2019-12-18 16:31:53

Tec 发表于 2019-12-18 16:28
不清楚你那边的具体情况,我也不知道。。

能不能加下qq我把vc++ 6.0 发给你你调一下。麻烦了,可以吗,可以的话你私法给我   ,我发不了私人消息。。。。。麻烦了,这个真的对我很重要。

Tec 发表于 2019-12-18 16:38:21

下一个vs的社区版呗,都免费的

夏目灬 发表于 2019-12-18 16:43:14

Tec 发表于 2019-12-18 16:38
下一个vs的社区版呗,都免费的

可惜的是我们学生是要用vc++的   很谢谢你了。

夏目灬 发表于 2019-12-18 17:29:07

Tec 发表于 2019-12-18 16:38
下一个vs的社区版呗,都免费的

可以了感谢回答
页: [1]
查看完整版本: 我代码出问题了,( missing ';' before 'type')求大佬看看。不难的,