将目录中的文件名添加到 char* 数组。 C++

Posted

技术标签:

【中文标题】将目录中的文件名添加到 char* 数组。 C++【英文标题】:Adding filenames from a directory to a char* array. c++ 【发布时间】:2017-08-16 11:57:04 【问题描述】:

我正在尝试从目录中获取文件名并将其放入 char* 数组中以供以后使用。但这似乎不像我想要的那样工作。打印时只在所有位置显示最后一个文件名。

所以我的问题是如何在 char*[] 内的每个位置添加文件名?

/*Placed outside*/
int i = 0;
char* Files[20] = ;
/*Placed outside*/

while (handle != INVALID_HANDLE_VALUE)

    char buffer[4100];
    sprintf_s(buffer, "%ls", search_data.cFileName);
    Files[i] = buffer;
    i++;
    if (FindNextFile(handle, &search_data) == FALSE)


  /*Printing I use ImGui*/
 #define IM_ARRAYSIZE(_ARR)  ((int)(sizeof(_ARR)/sizeof(*_ARR)))
static int listbox_item_current = 1;
ImGui::ListBox("", &listbox_item_current, Files, i, 4);

【问题讨论】:

Files[i] = buffer; 复制一个临时地址。如果你不明白它的含义,不要使用C风格的char数组和char*的数组;使用std::string 部分代码,帮不上忙 只要使用std::string std::string 具有方法 c_str,它返回以 NULL 结尾的 char* @ILIke***WhanIgetHelp Imgui 不支持 std::string 或 std::wstring 不会阻止您的代码使用它们。 【参考方案1】:

你可以使用 C++ 标准文件系统,但我猜你需要 C++17(或至少 VS15),不太确定。

您必须包括:

#include <experimental/filesystem>
#include <filesystem>
using namespace std::experimental::filesystem::v1;

使用应该很简单:

int i = 0;
const char * directoryToSearch = "C:\etc\etc";
for (const auto & file : directory_iterator(directoryToSearch)) 
    files[i] = new char[file.path().stem().string().length() + 1];
    strcpy(files[i], file.path().stem().string().c_str());
    ++i;

确实,您应该在使用完数组后清理它。别忘了,目前没有多少编译器支持这个。

【讨论】:

谢谢 :D 这解决了我的问题 :D +缩短了代码【参考方案2】:

打印时它只在所有位置显示最后一个文件名。 这很正常:您将每次迭代的文件名存储在同一个缓冲区中,然后将缓冲区的地址复制到您的数组中。与问题无关,因为buffer 是在循环内声明的自动变量(块范围),在循环外使用它是未定义的行为,因此您以 dangling 指针数组结束。

正确的方法是使用二维数组char Files[MAX_PATH][20]; 并在每个插槽中存储一个文件名,或者使用由new(或更低级别的malloc)分配的动态内存。对于第二个选项,您可以手动进行,为每个文件名分配内存 - 并记住在最后释放任何内容,或者您​​可以让标准库为您管理它,方法是:

std::vector<std::string> Files;
...
while(...) 
    ...
    File.push_back(search_data.cFileName);

Dear ImGui 提供了一个ListBoxctor,它允许传递一个不透明的数据存储和一个提取器,它可以在这里使用:

bool string_vector_items_getter(void* data, int idx, const char** out_text) 
    std::vector<std::string> *v = reinterpret_cast<std::vector<std::string> >(data);
    if (idx < 0 || idx >= v.size()) return false;
    *out_text = v[idx].c_str();
    return true;

然后:

ImGui::ListBox("", &listbox_item_current, &string_vector_items_getter, &Files, i, 4);

(注意:未经测试的代码!)

【讨论】:

以上是关于将目录中的文件名添加到 char* 数组。 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++:不能将 char 数组添加到双端队列?

C++怎样将一个数插入到数组末尾?

将元素添加到结构中的 char 数组

在 C++ 中连接 char 数组

将 char 数组从 c++ 传递到 fortran

(C++)将string型vector中的元素复制到char型数组中。。出错!