Сохранить все имена файлов из папки в вектор - PullRequest
0 голосов
/ 07 мая 2019

это код. Все работает хорошо, но когда я пытаюсь нацелиться, например:

cout << getAllSongs("path\\*")[1]

вывод ничего, ничего не показывает

vector<string> getAllSongs(string path) {
    // can queue up up to 1000 melodii
    vector<string> songList(1000);

    WIN32_FIND_DATA FindFileData;
    string all = path;
    HANDLE hFind = FindFirstFile(all.c_str(), &FindFileData);
    if (hFind == INVALID_HANDLE_VALUE) {
        cout << hFind;
        cout << "there is a handle problem";
        exit(-1);
    }
    else do {
        //cout << FindFileData.cFileName << endl; this works
        songList.push_back(FindFileData.cFileName);
    } while (FindNextFile(hFind, &FindFileData));
    FindClose(hFind);

    return songList;    
}

1 Ответ

1 голос
/ 07 мая 2019

Независимо от того, что на самом деле находится в папке, вы всегда предварительно заполняете вектор 1000 пустыми строками, а затем добавляете имена файлов, начиная с индекса 1000. Таким образом, строка в vector[1] всегда пуста.

Попробуйте вместо этого что-нибудь еще:

vector<string> getAllSongs(string path) {
    // can queue up up to 1000 melodii

    //vector<string> songList(1000); // <-- DO NOT create 1000 empty strings!
    vector<string> songList;
    songList.reserve(1000); // <-- DO THIS instead!

    WIN32_FIND_DATAA FindFileData;
    HANDLE hFind = FindFirstFileA(path.c_str(), &FindFileData); // <-- use the ANSI function explicitly!
    if (hFind == INVALID_HANDLE_VALUE) {
        if (GetLastError() != ERROR_FILE_NOT_FOUND) { // <-- ADD error checking...
            cout << "there is a problem with the search!";
        }
    }
    else {
        do {
            if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { // <-- ADD type checking...
                //cout << FindFileData.cFileName << endl; this works
                songList.push_back(FindFileData.cFileName);
            }
        }
        while (FindNextFileA(hFind, &FindFileData)); // <-- use the ANSI function explicitly!

        if (GetLastError() != ERROR_NO_MORE_FILES) { // <-- ADD error checking...
            cout << "there is a problem with the search!";
        }

        FindClose(hFind);
    }

    return songList;    
}
vector<string> songs = getAllSongs("path\\*");
if (!songs.empty()) { // <-- ADD error checking...
    cout << songs[0]; // <-- ONLY non-empty filenames exist in the vector now!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...