2013-04-15 52 views
0

我想在同一个目录中保存多个文件名。但它似乎只保存数组中的最后一个文件。 这里是我的代码:在一个目录中保存多个文件名(win32 C++)

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

的问题是此行:

files [count] = FindFileData.cFileName;

它将FindFileData.cFileName的地址复制到文件[count]中。由于地址始终相同,文件数组中的所有数组项都将始终包含相同的值。

你必须复制整个字符串不只是一个指针。声明文件变量为:

char files [MAC_FILE_COUNT] [MAX_PATH];

然后更换线 “文件[数] = FindFileData.cFileName” 与:

的strcpy(文件[COUNT],FindFileData.cFileName);

0

此行

files[count] = FindFileData.cFileName; 

不会复制该字符串,它只是一个地址的副本。这是一个指针分配。因此files[]中的每个元素都指向相同的内存块,即字符数组FindFileData.cFileName。所以自然,最后一个复制到FindFileData.cFileName的值就是您在files[]中查看所有指数时看到的值。

如果你想复制字符串,你需要使用strcmp。而且你几乎肯定不会为files[]中的char*指针分配任何内存,所以你也需要这样做。使用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 
} 
相关问题