[M1 Mac, MacOS Ventura 13.3.1, clang 14.0.3]
レスを右下に表示できるようになりました。
シフトJISのdatファイルとして一旦保存してしまうと、UTF-8への変換が自分のスキルではかなり難しいので、文字列の状態で変換してからファイルにしました。macOSは日本語を扱う上で不利になることが多いです。
これで基本機能の実装は完了です。だらだら作って4日半でした。GUIは丸一日掛かりました。
レス表示欄は生データそのままなのでかなり見づらいです。テキスト整形は今後の課題とします。
extern vector<tuple<string, string, string, string>> numTitlePostnumID;
extern string id, num, title, postnum, boardURL;
extern vector<tuple<string, string, string>> urlNameCat;
extern Fl_Text_Display* contentDisplay;
void button_cb(Fl_Widget *w, void*) {
string selectID;
const char* label = w->label();
cout << "label: " << label << endl;
for (const auto& tuple : numTitlePostnumID) {
if (std::get<1>(tuple) == label) {
selectID = std::get<3>(tuple);
}
}
string url = boardURL + "dat/" + selectID + ".dat";
std::string datBuffer;
string filename = "/Users/[ユーザ名]/BBS_Browser/" + selectID + ".dat";
cout << "url: " << url << endl;
cout << "filename: " << filename << endl;
CURL* curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &datBuffer);
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "Error: " << curl_easy_strerror(res) << std::endl;
return;
}
curl_easy_cleanup(curl);
} else {
std::cerr << "Failed to initialize curl" << std::endl;
return;
}
// 文字コードをCP932からUTF-8へ変換
datBuffer = ConvertShiftJISToUTF8(datBuffer);
std::ofstream file(filename, std::ios::binary);
file << datBuffer;
file.close();
// ファイル内容表示
std::ifstream ifile(filename);
if (!ifile.is_open()) {
cout << "ファイルopen失敗" << endl;
return;
}
Fl_Text_Buffer* buffer = new Fl_Text_Buffer();
contentDisplay->buffer(buffer);
string line;
while (std::getline(ifile, line)) {
buffer->append(line.c_str());
buffer->append("\n");
}
// 現在の行数を取得
int lineCount = contentDisplay -> buffer() -> count_lines(0, contentDisplay -> buffer() -> length());
// 最終行が見えるようにスクロールを設定
contentDisplay -> scroll(lineCount, 0);
ifile.close();
return;
}