[C++] 145 FLTK : Fl_Browserの最終行を常に表示 

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

すぐに分かるだろうと思っていたものの、そうでもなかったです。結構重要な機能のはずですが、かなりそっけない扱いです。まあSwingと比べてしまうのは酷でしょうか。

browser->load(outputText);

int line_num = browser->size(); // 全行数取得

browser->bottomline(line_num);

[C++] 144 FLTK : 標準出力の表示 Fl_Browser

[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);