
C言語でファイル一覧を読み込む関数を使いたいのですが、
Linuxとwindowsで共通になるようにラッピングAPIを作りたいです。
環境はLinuxはGCC、windowsはVC++6です。
my_opendir()、my_readdir()、my_closedir()というAPIとして、
Linux側はそれぞれopendir()、readdir()、closedir()を
内部で呼べばいいですが、問題はwindowsです。
my_opendir()内部で_findfirst()を呼んでしまうと、
一個目のファイルが読まれてしまいます。
グローバル変数に読まれたデータを保存して、
my_readdir()時の最初の時に読み出す方法も考えたのですが、
これだとリエントラントになりません。
何かいい方法はないでしょうか?
No.2ベストアンサー
- 回答日時:
my_opendirの返す値を構造体にして、その中にデータを保存すればいいでしょう。
struct my_opendir_data {
long handle; /*_findfirstの返したハンドル*/
char *firstfile; /* _findfirstが返した最初のファイル名*/
};
struct my_opendir_data *my_findfirst(const char *dir)
{
(略)
long handle = _findfist(filename, &fileinfo);
struct my_opendir_data *data = malloc(sizeof(*data));
data.handle = handle;
data.firstfile = malloc(strlen(fileinfo.name)+1);
strcpy(data.firstfile, fileinfo.name);
return data;
}
BOOL my_readdir(char *dst, struct my_opendir_data *data)
{
if (data->firstfile) {
strcpy(dst, data->firstfile);
free(data->firstfile);
data->firstfile = NULL;
return TRUE;
} else {
_findnextの呼び出し
}
}
BOOL my_closedir(struct my_opendir_data *data)
{
_findclose(data->handle);
free(data->firstfile);
free(data);
}
こんな感じで。
なるほど。
構造体の中にmallocした領域のポインタを保存しておくのですね。
正直、引数をopendir()/readdir()/closedir()と合わせたいのと
mallocをできるだけ使いたくなかったので、
あんまり考えないで居たのですが、
結構すっきりするものですね。
ありがとうございました。
No.3
- 回答日時:
ANo.1です。
> 結局、staticな変数を使うのでリエントラントにならないなぁと。
my_opendir()の返値を構造体ポインタにして構造体に必要なデータを含ませればstatic変数は必要なくなるよ。構造体はmallocで確保するか、面倒なら引数で受け取るようにしても良い。
これは一般的なリエントラント化の手法なのでちゃんと理解しておいた方が良いよ。
No.1
- 回答日時:
my_opendir()は何を返すの?
opendir()から類推すると何らかの構造体へのポインタを返すでしょうから、この構造体に必要なデータを保持できるようにすれば良いでしょう。
_findfirst()の呼び出しはmy_opendir()では行わず、初めてmy_readdir()が呼び出された時点で行うことも可能だと思います。
この回答への補足
お礼のところで間違いが一点。
×Linuxならdirent *でwindowsならlongとかかなぁ
○LinuxならDIR *でwindowsならlongとかかなぁ
結局、staticな変数を使うのでリエントラントにならないなぁと。
割り込み禁止にすればいい話なんですけど。
my_opendir()の返り値はあんまり考えてなかったです。
MY_DIRHANDLE型とか定義して、Linuxならdirent *でwindowsならlongとかかなぁ。
一番いいのは_findnext()で取れるファイル名を一個戻せれば一番なんですけど・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データの値の近いものをグルー...
-
printfの%eで指数部分の桁数を...
-
ポインター引数の関数でコンパ...
-
CreateProcessでの環境変数の設...
-
C#でのswitch文
-
linuxのシェルでファイル名に先...
-
stable diffusionのエラー
-
sort関数でひらがなとカタカナ...
-
【Excel VBA】10進数を2進数に...
-
C言語について
-
pythonでDBのカラム名で取得し...
-
UTF-8で5~6バイトになる文字コ...
-
COBOLのCOMP形式について
-
エクセルシート名の制限を変更...
-
10Mバイトて文字数に すると何...
-
SQLで1バイト、2バイト混在...
-
C++ Builderで文字列をバイトに...
-
ListView重複データ削除
-
Excel VBA メール作成について ...
-
COBOL PICTUREで X,S,Vの意味
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
【Excel VBA】10進数を2進数に...
-
ポインター引数の関数でコンパ...
-
matlabでのRRI検出
-
C#でのswitch文
-
int型(2バイト)データの分割
-
C言語 ファイル内のデータと入...
-
'dataType' 引数を Null にする...
-
RegQueryValueExでの2バイト文字
-
iアプリ jamファイルの動的な出力
-
[error] [client ---- ] Argument
-
EOM間にperl文を作成したい
-
平滑化フィルタ
-
任意な項目のソート
-
変数の書き方
-
Cプログラムがどうしても動きま...
-
hiddenを使ったセッション
-
機械受注は?
-
チェックボックスの値だけが受...
おすすめ情報