【发布时间】:2018-02-05 01:26:30
【问题描述】:
我正在尝试制作一个 C++ 程序来模拟 Linux shell。没什么好想的,只是几个命令。
我正在尝试这样做:
我创建了一个类,试图用节点和子节点来模拟文件系统。 每个节点可以有 n 个子节点,每个子节点都有一个指向其父节点的指针。
Node 类如下所示:
class Node
{
public:
Node();
Node(bool isFile);
Node(string name);
friend class Tree;
bool isFile;
vector<Node*> childs;
string name;
string text;
Node *parrent;
string names = "-";
protected:
private:
};
我创建了一个 addNode 方法,我想用它来将节点添加到我的“树”中。我试图做的是这样:
void Tree::addNode(string name,bool isFile,string pwd)
{
size_t pos=0;
string delimiter = "\\";
string token;
Node *inserter = new Node();
Node *aux;
inserter->name=name;
inserter->isFile=isFile;
aux=&this->root;
pos = pwd.find(delimiter);
token = pwd.substr(0,pos);
pwd.erase(0,pos + delimiter.length());
if((pos = pwd.find(delimiter)) == string::npos)
{
inserter->parrent=aux;
if(aux->names.find(name) == string::npos)
{
aux->childs.push_back(inserter);
aux->names.append(name);
aux->names.append(" ");
}
else
{
cout << "The directory already exists" << endl;
}
}
else
{
while((pos = pwd.find(delimiter)) != string::npos)
{
token = pwd.substr(0,pos);
pwd.erase(0,pos + delimiter.length());
for(int i = 0; i<aux->childs.size(); i++)
{
if(aux->childs[i]->name.compare(token))
{
aux=aux->childs[i];
cout << token << endl;
}
}
}
inserter->parrent=aux;
if(aux->names.find(name) == string::npos)
{
aux->childs.push_back(inserter);
aux->names.append(name);
aux->names.append(" ");
}
else
{
cout << "The directory already exists" << endl;
}
}
}
所以,基本上,每次我调用这个方法时,我都想确保每个目录都存在,并且我将指针 aux 更改为指向子地址,等等。
第一个 if 是用于在根目录中创建目录,以及其他每个目录的时间。
但是,由于我对指针的理解不好,我看不出哪里出错了。 当我在“根”节点中添加节点时,一切正常,但是当我在任何子节点中添加节点时,事情就变糟了,我无法完全理解它。
我也实现了 ls 和 cd ls 工作正常,但 cd 不行。我在检查目录是否存在时尝试做同样的事情,但有时,即使目录不存在,如果您键入 cd "您所在的目录名称in" 它只是添加到 pdw,即使该目录不存在。
这里是cd方法
bool Tree::exitsChild(string name,string pwd)
{
size_t pos=0;
string delimiter = "\\";
string token;
Node *aux;
aux=&root;
pos = pwd.find(delimiter);
token = pwd.substr(0,pos);
pwd.erase(0,pos + delimiter.length());
if((pos = pwd.find(delimiter)) == string::npos)
{
if(aux->names.find(name)!= string::npos)
{
return true;
}
else
return false;
}
else
{
while((pos = pwd.find(delimiter)) != string::npos)
{
token = pwd.substr(0,pos);
pwd.erase(0,pos + delimiter.length());
for(int i = 0; i<aux->childs.size(); i++)
{
if(aux->childs[i]->name.compare(token))
{
aux=aux->childs[i];
}
}
}
if(aux->names.find(name) != string::npos)
{
return true;
}
else
{
return false;
}
}
}
【问题讨论】:
-
如果
i保持不变,aux=aux->childs[i];之后会发生什么? -
什么意思?没看懂问题,i要么是0,要么是从0到向量的大小。