将目录中的文件名添加到 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 提供了一个ListBox
ctor,它允许传递一个不透明的数据存储和一个提取器,它可以在这里使用:
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++的主要内容,如果未能解决你的问题,请参考以下文章