【问题标题】:Saving multiple file names in a directory(win32 c++)在一个目录中保存多个文件名(win32 c++)
【发布时间】:2013-04-15 01:44:44
【问题描述】:

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

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

【问题讨论】:

    标签: c++ file winapi


    【解决方案1】:

    问题出在这一行:

    files[count] = FindFileData.cFileName;

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

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

    字符文件[MAC_FILE_COUNT][MAX_PATH];

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

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

    【讨论】:

      【解决方案2】:

      这一行

      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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多