0

私は次のようなアルゴリズムを持っています

1.ディレクトリ内のすべてのファイルをスキャンします(Cを使用して実行)

2.ループ内の現在のファイルのファイルサイズを取得します(Cを使用して実行)

3. 8 kb未満の場合は、何かを実行して、次の即時ファイル名を配列に格納します(Cでは連想配列がサポートされていないようです)

私はこれをPHPで行いましたが、予期しないイベントのため、Cで記述する必要があります。Cに関するチュートリアルをかなり行ったのですが、正直言って、基本を正しく理解するために必要だと思った時間を過小評価していました。

かなりの時間が経過した後、ディレクトリ内のファイルを一覧表示するコードを手に入れることができました。

#include <dirent.h> 
#include <stdio.h>
#include <conio.h>

int main(void)
{ 
  char path = "D:\\ffmpeg\\bin\\frames\\"; 
  DIR           *d;
  struct dirent *dir;
  char test;
  d = opendir("D:\\ffmpeg\\bin\\frames\\");
  if (d)
  {
    while ((dir = readdir(d)) != NULL)
    {      
       printf("%s\n", dir->d_name);
    }

    closedir(d);
  }
  getchar();
  return(0);
}

これで、ループ内の現在のファイルが。で表されることは明らかですdir->d_name。私が立ち往生しているのは、これを取り"D:\\ffmpeg\\bin\\frames\\"、パスが次のようになるように追加することです"D:\\ffmpeg\\bin\\frames\\somename.jpg"

これは、ファイルの直接パスを取得するのに役立ちます。これを取得すると、手順2に進むために必要なデータが得られます。現在直面している問題は、文字列の連結です。試しstrcat()ましたが、うまくいきませんでした。

だから基本的に私が探しているのは

while ((dir = readdir(d)) != NULL)
{      
   // merge "path" and "dir->d_name" to get something similar like
   // "D:\\ffmpeg\\bin\\frames\\somename.jpg"
}

何か助け、提案はありますか?

4

2 に答える 2

1

strcat()文字列に結果を保持するのに十分なスペースがある場合にのみ有効であり、ループを通過する後続のパスで宛先が無効になります。

asprintf()小さな注意点がありますが、代わりに関数をお勧めします。それはあなたが返す責任があるメモリを割り当てます。

while ((dir = readdir(d)) != NULL)
{
   char *fullname;
   asprintf(&fullname, "%s%s", "D:\\ffmpeg\\bin\\frames\\", dir->d_name);
   printf("%s\n", fullname);

   // now do things with `fullname`

   free(fullname); // return the memory allocation at the end of the loop
}
于 2013-02-14T12:23:03.330 に答える
1

プレーンCで推奨される解決策は次のsnprintfとおりです。

char buf[MAX_PATH];
snprintf(buf, sizeof(buf), "%s%s", path, dir->d_name);

strcat()またはを使用しないでくださいstrncat()

MSVCを使用している場合、Cの実装は24年前のものであり、snprintf()使用できません。オプションは次のとおりです。

  1. _snprintf()その後、回避策として使用しbuf[sizeof(buf)-1] = '\0';ます。

  2. C++とを使用しstd::stringます。

  3. Cygwinを使用します。

于 2013-02-14T12:23:41.897 に答える