这实际上是我的导师提供给我们使用的程序,到目前为止我必须进行一些更改才能使其至少编译:
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <cstdlib>
#include <iostream>
#include <cctype>
#include <cstdio>
#include <string>
#include <list>
using namespace std;
std::string makeString();
std::string path= "/";
DIR*dirp;
struct dirent*direntp;
std::list<string> child_directories;
void dir_traverse(&path, ios::out){
list<string> child_directories;
DIR*dirp = opendir(path.data());
struct dirent*dir_entry = readdir(dirp);
while(dir_entry !=null){
unsigned char d_type = dir_entry->d_type==DT_OIR?'D' : 'R';
if(d_type == 'D'){
if(dir_entry->d_name[0]!= '.')
{
child_directories push_back(dir_entry_d_name);
}
}
out<<'\t'<<d_type<<":"<<dir_entry->d_name<<endl;
dir_entry= readdir(dirp);
}
list<string>::iterator it = child_directories.begin();
while(it! = child_directories.end())
{
dir_traverse(&path + "/" + *it, out);
it++;
}
closedir(dirp);
}
我在参考dir_traverse函数时得到了错误。我非常有兴趣弄清楚导致问题的原因和原因。函数中有一半是我目前没有得到的,这可能就是我编译问题的原因。只是还没有达到c / c ++的速度:)
感谢
编辑:
void dir_traverse(string& path, ostream& out){
list<string> child_directories;
DIR*dirp = opendir(path.data());
struct dirent*dir_entry = readdir(dirp);
while(dir_entry !=NULL){
unsigned char d_type = dir_entry->d_type==DT_DIR?'D' : 'R';
if(d_type == 'D'){
if(dir_entry->d_name[0]!= '.')
{
child_directories.push_back(dir_entry_d_name);
}
}
out<<'\t'<<d_type<<":"<<dir_entry->d_name<<endl;
dir_entry= readdir(dirp);
}
list<string>::iterator it = child_directories.begin();
while(it != child_directories.end())
{
dir_traverse(&path + "/" + *it, out);
it++;
}
closedir(dirp);
}
答案 0 :(得分:2)
void dir_traverse(&path, ios::out)
这看起来像一个函数定义,除了参数是错误的。函数声明如下:
return_type function_name( arg0_type arg0, ..., argN_type argN )
答案 1 :(得分:2)
好的,所以你需要对教师的样本做一些修改才能让它编译。</ p>
我假设你已经包含了编译所需的四个头文件。我建议您从std
namespace
中提取以下四个符号,而不是全部。我个人更喜欢在我的代码中引用std::string
。
using std::string;
using std::ostream;
using std::list;
using std::endl;
无论如何,只需要修改以下三行:
void dir_traverse(string& path, ostream& out)
应该......
void dir_traverse(const string& path, ostream& out)
因为你后来在递归调用函数时传入一个临时函数。
child_directories.push_back(dir_entry_d_name);
应该......
child_directories.push_back(dir_entry->d_name);
这看起来像一个错字!
dir_traverse(&path + "/" + *it, out);
应该......
dir_traverse(path + "/" + *it, out);
这看起来也像一个错字。这是您创建我之前提到的临时path
string
的地方。这必须作为const
引用传递(因为它不通过值传递)。
当您练习更多时,您将更加适应编译器的错误消息!
祝你好运!