我是c ++世界的新手,我只是将它用于帮助我工作的litle应用程序,现在,我需要阅读文件夹的内容,列出文件夹内容,我已经创建了一个函数返回一个指针,文件夹中的每个obj的名称,但现在,我不知道如何读取指针的内容只是在控制台中打印它,我的功能看起来像这样
string* listdir (const char *path)
{
string* result = new string[50]; // limit to 50 obj
DIR *pdir = NULL;
pdir = opendir (path);
struct dirent *pent = NULL;
if (pdir == NULL)
{
printf ("\nERROR! pdir could not be initialised correctly");
return NULL;
}
int i = 0;
while (pent = readdir (pdir))
{
if (pent == NULL)
{
printf ("\nERROR! pent could not be initialised correctly");
return NULL;
}
//printf ("%s\n", pent->d_name);
result[i++]= pent->d_name;
}
closedir (pdir);
return result;
}
我一直在尝试打印teh功能的结果
int main()
{
string *dirs;
dirs = listdir("c:\\");
int i = 0;
//while(dirs[i])
//{
//cout<<dirs[i]<<'\n';
//++i;
//}
}
但我真的不知道我在做什么,哈哈,一些帮助将是完美的 感谢
答案 0 :(得分:5)
检查您的while
循环条件:dirs[i]
是std::string
。您在布尔上下文中使用字符串对象:您希望std::string
转换为bool
吗?
我的建议:抛弃固定大小的数组并转到std::vector
。
void listdir(const char *path, std::vector<std::string> &dirs)
{
/* ... */
while (pent = readdir (pdir))
{
/* ... */
dirs.push_back(pent->d-name);
}
closedir(pdir);
}
int main()
{
std::vector<std::string> dirs;
listdir("c:\\", dirs);
for (std::vector<std::string>::const_iterator it = dirs.begin(), end = dirs.end(); it != end; ++it)
std::cout << *it << std::endl;
}
答案 1 :(得分:3)
int main()
{
string *dirs;
dirs = listdir("c:\\");
for (int i = 0; i < 50 && dirs[i].size() > 0; ++i)
{
cout << dirs[i] << '\n';
}
}
dirs
是指向数组的指针,因此您可以像数组一样索引它。你创建了一个50的数组,所以你也需要将自己限制在50。由于您可能没有填充整个数组,因此.size()检查允许打印循环提前停止。
答案 2 :(得分:3)
您的代码中存在一些主要的混淆,特别是在字符数组,字符串和字符串数组之间。此外,还有内存泄漏。
以下是我的问题/疑虑:
opendir
函数
使用null参数。你应该
在调用之前检查空路径
opendir
。listdir
函数)的变化,
该功能的用户是
注定。pent->d_name
的类型
与string *
相同?pent->d_name
,被复制到
结果数组,但不是内容
目录名称。操作系统可能
重复使用此位置而不告诉
您;所以复制的地址
文字不是一个好主意。main
功能不会删除
分配给的内存
结果。这被称为记忆
泄漏。std::string
功能。这照顾
为文本分配内存。std::vector<string>
结果。这需要知道
目录的数量和没有
需要动态分配或
释放记忆。std::string
pent->d_name
并使用push_back
将字符串附加到结果。答案 3 :(得分:2)
在C ++中,使用*
运算符取消引用指针,就像在“C”中一样。
但是,您的代码存在许多问题,我在这里已经解决了,因为我很无聊......
#include <string>
#include <iostream>
#include <list>
#include <dirent.h>
typedef std::list<std::string> dir_list;
bool listdir(const std::string& path, dir_list& result)
{
bool retval = true;
DIR* pdir = opendir(path.c_str());
if (pdir == NULL)
{
std::cerr << "ERROR! pdir could not be initialised correctly" << std::endl;;
retval = false;
}
else
{
for (dirent* pent = readdir(pdir); pent != NULL; pent = readdir(pdir))
{
if (pent == NULL && result.empty())
{
std::cerr << "ERROR! pent could not be initialised correctly" << std::endl;
retval = false;
}
if (result.size() < 50)
{// *really* limit to 50!
result.push_back(pent->d_name);
}
}
closedir(pdir);
}
return retval;
}
int main()
{
dir_list dirs;
if (listdir("C:/", dirs))
{
for (dir_list::const_iterator iter(dirs.begin()), end(dirs.end()); iter != end; ++iter)
{
std::cout << *iter << std::endl;
}
}
}
由于你正在使用C ++,STL,它的string
和容器类将为你节省指针痛苦的世界!
答案 4 :(得分:0)
你的while语句看起来很奇怪,看起来它期望dirs[i]
成为一个指针,但我相信dirs[i]
将是一个非指针类型。也许把它改成(假设string是std :: string):
while(i < 50 && dirs[i].length() > 0)
{
cout<<dirs[i]<<'\n';
++i;
}