人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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 ?配列;
}

●質問者: loopring
●カテゴリ:コンピュータ 学習・教育
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● hissssa
●150ポイント

一般に、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に設定するポインタ配列の総数が事前決定できないのです。

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

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


loopringさんのコメント
ご回答ありがとうございます 自分には、少しレベルが高いのですが、時間をかけて理解したいと思います

2 ● fenstrial
●150ポイント

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を混同していません?


loopringさんのコメント
ご回答ありがとうございます もともとobjective-cのNSFileManagerを使っていたのですが、下記の記事を見まして、c言語での配列についてご質問させていただいた次第です。 [iOS] ディレクトリ配下の総ファイルサイズを計算する 〜 BSDのftsを使う http://cocoadays.blogspot.jp/2011/03/ios-bsdfts.html
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ