[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]
コンソールコマンドによるファイル検索結果をFl_Multiline_Outputに表示しようとしてうまくいかず苦慮していましたが、検索結果を一旦テキストファイルとして出力し、Fl_Browserに読み込ませるとすんなりできました。テキストファイルはホームディレクトリ直下に置きました。
popen関数を使った場合はpclose関数で、fopen関数はfclose関数で閉じます。popenをfcloseで閉じようとしたために2回目以降の検索結果が表示されず、少し手間取ってしまいました。
これまではFl_Multiline_Outputがまともに使えない状態だったため、やむなくコンソール付き実行ファイルを使っていましたが、これでappファイルにて完結できるようになりました。
#define READ_SIZE 12800 // 検索結果は最大12800バイトまで
const char* outputText;
void outputTextMake(string cmd){
char str[READ_SIZE];
size_t ret;
FILE* fp = popen(cmd.c_str(), "r"); // コマンドに対する出力をFILE構造体として受け取る
FILE* fo = fopen(outputText, "a+"); // 検索結果を追記していく,起動時に削除初期化
while(1){
ret = fread(str, sizeof(char), READ_SIZE, fp);
fwrite(str, sizeof(char), ret, fo);
if(ret < READ_SIZE){
break;
}
}
// 文字列追記
string finish = "検索完了\n";
fprintf(fo, "%s", finish.c_str());
pclose(fp);
fclose(fo);
}
// 出力ファイル名作成
const char* homedir = getenv("HOME");
cout << "homedir " << homedir << endl;
string outputText_str = string(homedir) + "/_filefinder.txt"; // 検索結果記録ファイルパス
outputText = outputText_str.c_str();
remove(outputText); // 削除初期化
Fl_Browser *browser;
stringstream cmd;
cmd << "cd " << [選択したディレクトリパス] << " && " << "find `pwd` -type file ";
outputTextMake(cmd.str());
browser->load(outputText);