在<dirent.h> </dirent.h>中使用DIR读取文件名

时间:2015-03-20 13:42:53

标签: c++ macos dirent.h

所以,我正在为我的C ++课程开发一个项目。我正在制作音乐播放器,但从文件夹中读取有些问题。我目前正在从文本文件中读取歌曲名称,但我想从文件夹中的文件中读取名称。 旧代码:

std::vector<Song>tempHold;
string songNames;
string fileName = resourcePath()+"songsFile.txt";
std::ifstream dataIn;
//int wantedSongs = 16;
dataIn.open(fileName.c_str());
if(dataIn.is_open())
{
    while(getline(dataIn,songNames))
    {
        tempHold.push_back(Song(songNames,"Taylor Swift"));
        amount++;
    }

}else{
    std::cout << "error opening file";
    return tempHold;
}

不起作用的新代码(这是我需要帮助的代码)

std::vector<Song>addSongsDir(int &amount)
{
    std::vector<Song>tempHold;
    string aLine;
    string songNames;
    string fileName = "/Users/adambjorkman/Desktop/testmusik";
    DIR * songDir;
    songDir = opendir(fileName.c_str());
    while(readdir(songDir))
    {
        tempHold.push_back(Song(songNames,""));
        std::cout << songNames;
    }
}

我现在又做了一次尝试

std::vector<Song>addSongsDir(int &amount)
{
    std::vector<Song>tempHold;

    string aLine;
    string songNames;
    string fileName = "/Users/adambjorkman/Desktop/testmusik";
    DIR * songDir;
    songDir = opendir(fileName.c_str());
    struct dirent *songDirent;
    if(songDir == NULL)
    {
        throw " No such directory";
    }
    else
    {

        while((songDirent = readdir(songDir)))
        {
            songNames = songDirent->d_name;
            tempHold.push_back(Song(songDirent->d_name,""));
            std::cout << songNames;
        }
    }
    return tempHold;
}

1 个答案:

答案 0 :(得分:0)

首先,您不会返回任何内容(缺少return tempHold;)。

其次,您没有正确使用readdir()。它返回struct dirent,其中包含有关其找到的文件的信息。您需要将文件名附加到您传入的目录名称,以便创建完整路径。

第三,您需要通过调用closedir()对象上的DIR *来避免资源泄漏。

最后,您应该添加一些错误检查(如果您没有指定目录,opendir()将失败),它将帮助您的开发人员在日志文件或其他内容中查看这些错误消息。