C言語で、ftsを用いて、文字列(ファイルの絶対パス)を格納した配列を返す関数を作ろうとしています。

iPhone用のプロジェクトで用いる予定です。
途中までできていますが、C言語の素人なもので、以下の点が分かりません。

下記コードの①②③④について、お教えください。

+( ①戻り値の型 )getPathList:(NSString *)path
{
②配列の宣言
FTS* fts;
FTSENT *entry;
char* paths[] = {
[path cStringUsingEncoding:NSUTF8StringEncoding], NULL
};
fts = fts_open(paths, 0, NULL);
while ((entry = fts_read(fts))) {
③絶対パス(entry->fts_path)の配列への格納処理;
}
fts_close(fts);
return ④配列;
}

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/04/09 22:10:26
  • 終了:2012/04/10 21:57:16

回答(2件)

id:hissssa No.1

hissssa回答回数423ベストアンサー獲得回数1272012/04/10 12:57:13

ポイント150pt

一般に、C言語で文字列の配列を扱うには、「ポインタへのポインタ」を使います。
まずポインタ群を入れる配列を用意した上で、その配列の個々のポインタに文字列を登録していくわけです。

例示するとこんな感じで:

void main()
{
 char **array=func();
 printf("%s",array[0]);
 printf("%s",array[1]);
  ・
  ・
  ・
}

char **func()
{
 char **ret;
 ret=(char **)malloc( sizeof(char *) * 10 ); <-文字列10個ぶんのポインタ配列を確保

 ret[0]=(char *)malloc( .... );   <-最初の文字列のバッファを確保
 strcpy(ret[0] , ..... );      <-最初の文字列をコピー

 ret[1]=(char *)malloc( .... );   <-2つ目の文字列のバッファを確保
 strcpy(ret[1] , ..... );      <-2つ目の文字列をコピー
  ・
  ・
  ・
 return ret;
}


ご質問の例の場合も同様に処理することは可能ですが、fts_read()で得られる要素数の総数が事前にわからないのが難点になります。上記例で最初にretに設定するポインタ配列の総数が事前決定できないのです。

この場合の解決方法はいくつか考えられます。

  • 総数がだいたいわかっているなら、絶対に上限を超えないくらいのサイズをポインタ配列に指定する
  • ファイル検索処理を2回行い、1回目で総数をカウントしてからポインタ配列に確保し、2回目で文字列を設定する
  • realloc()を使ってポインタ配列を動的に拡張しつつ登録する
  • 文字列配列でなくリスト構造で管理する

いずれにしても、少々面倒な実装をする必要が生じます。

id:loopring

ご回答ありがとうございます

自分には、少しレベルが高いのですが、時間をかけて理解したいと思います

2012/04/10 22:09:07
id:fenstrial No.2

fenstrial回答回数57ベストアンサー獲得回数142012/04/10 15:32:58

ポイント150pt

C言語で書く場合、こんな感じかと。
「realloc()を使ってポインタ配列を動的に拡張しつつ登録する。」の方針を使ってます。サイズは倍々ゲームで。

char **getPathList(char *path){
FTS* fts;
FTSENT *entry;
int size = 10;
char **retArray = malloc(sizeof(char *)*size)
fts = fts_open(path, 0, NULL);
int i;
for(i=0;entry = fts_read(fts);i++) {
if(i==size){
size *= 2;
retArray = realloc(retArray,sizeof(char *)*size)
}
retArray[i] = malloc(entry->fts_pathlen);
memcpy(retArray[i],entry->fts_path,entry->fts_pathlen);
}
fts_close(fts);
return retArray;
}


ここまで書いといてなんですが、
c言語とobjective-cを混同していません?

id:loopring

ご回答ありがとうございます

もともとobjective-cのNSFileManagerを使っていたのですが、下記の記事を見まして、c言語での配列についてご質問させていただいた次第です。

[iOS] ディレクトリ配下の総ファイルサイズを計算する ~ BSDのftsを使う
http://cocoadays.blogspot.jp/2011/03/ios-bsdfts.html

2012/04/10 22:03:30

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません