我想在同一目录中保存多个文件名。但是它似乎只保存数组中的最后一个文件。 这是我的代码:
hFind = FindFirstFile("*.bin", &FindFileData);
if(hFind == INVALID_HANDLE_VALUE) {
printf("Not founded");
}
else {
printf("Found: %s", FindFileData.cFileName);
}
if(hFind != INVALID_HANDLE_VALUE) {
do
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
printf("\nFound: %s\n", FindFileData.cFileName);
}
else
{
filesize.LowPart = FindFileData.nFileSizeLow;
filesize.HighPart = FindFileData.nFileSizeHigh;
count++;
filesize.QuadPart += filesize.QuadPart;
printf("%s %ld bytes", FindFileData.cFileName, filesize.QuadPart);
printf("count number:%s\n", FindFileData.cFileName);
files[count] = FindFileData.cFileName;
printf("\nfiles array:%s", files[count]);
}
}
while (FindNextFile(hFind, &FindFileData) != 0);
//when I'm printing the file[3], it is showing the last file
printf("file in 3:%s", files[3]);
所以问题是整个数组只是填满了最后一个文件。每次进入下一个文件时,整个数组都被最后一个文件替换。我不知道这是win32问题还是别的什么。需要你的见解。提前谢谢!
答案 0 :(得分:0)
这一行
files[count] = FindFileData.cFileName;
不复制字符串,它只是地址的副本。这是一个指针赋值。因此files[]
中的每个元素都指向同一个内存块,即字符数组FindFileData.cFileName
。很自然地,复制到FindFileData.cFileName
的最后一个值是您在files[]
查看所有索引时所看到的值。
如果要复制字符串,则需要使用strcmp
。你几乎肯定不会为char*
中的files[]
指针分配任何内存,所以你也需要这样做。使用malloc()
和strlen()
。
但是,由于您将此标记为C ++,我将放弃使用原始数组,C字符串等,并切换到C ++标准容器。在这种情况下,您似乎想要vector<string>
。
像这样声明容器:
vector<string> files;
然后添加如下项目:
files.push_back(FindFileData.cFileName);
像这样迭代容器:
for(vector<string>::iterator it = files.begin(); it != files.end(); ++it) {
// do something with *it
}
答案 1 :(得分:0)
问题在于这一行:
files [count] = FindFileData.cFileName;
它将FindFileData.cFileName的地址复制到文件[count]中。由于地址始终相同,因此files数组中的所有数组项将始终包含相同的值。
您必须复制整个字符串而不仅仅是指针。将files变量声明为:
char文件[MAC_FILE_COUNT] [MAX_PATH];
然后用“
”替换“files [count] = FindFileData.cFileName”行strcpy(files [count],FindFileData.cFileName);