0

我想在同一个目录中保存多个文件名。但是,它似乎只保存了数组中的最后一个文件。这是我的代码:

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问题还是其他问题。需要你的见解。提前致谢!

4

2 回答 2

0

这条线

files[count] = FindFileData.cFileName;

不复制字符串,它只是地址的副本。这是一个指针赋值。所以 in 中的每个元素都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
}
于 2013-04-15T08:36:28.423 回答
0

问题出在这一行:

文件[计数] = FindFileData.cFileName;

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

您必须复制整个字符串而不仅仅是一个指针。将文件变量声明为:

字符文件[MAC_FILE_COUNT][MAX_PATH];

然后将“files[count] = FindFileData.cFileName”行替换为:

strcpy(files[count], FindFileData.cFileName);

于 2013-04-15T08:37:11.923 回答