c ++读取指针的内容

时间:2010-12-23 21:04:38

标签: c++ pointers

我是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;
    //}
}

但我真的不知道我在做什么,哈哈,一些帮助将是完美的 感谢

5 个答案:

答案 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)

您的代码中存在一些主要的混淆,特别是在字符数组,字符串和字符串数组之间。此外,还有内存泄漏。

以下是我的问题/疑虑:

问题/疑虑

  1. 可以调用opendir函数 使用null参数。你应该 在调用之前检查空路径 opendir
  2. 声明一些后返回NULL 变量。恕我直言,应该检查一下 声明前的参数 变量
  3. 如何知道有效的数量 条目在返回的数组中?
  4. 如果数组的大小(仅知道 到listdir函数)的变化, 该功能的用户是 注定。
  5. pent->d_name的类型 与string *相同?
  6. 目录名称的地址, pent->d_name,被复制到 结果数组,但不是内容 目录名称。操作系统可能 重复使用此位置而不告诉 您;所以复制的地址 文字不是一个好主意。
  7. main功能不会删除 分配给的内存 结果。这被称为记忆 泄漏。
  8. 建议/修正

    1. 在{li>中使用std::string 功能。这照顾 为文本分配内存。
    2. 使用std::vector<string> 结果。这需要知道 目录的数量和没有 需要动态分配或 释放记忆。
    3. 从中创建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;
}