したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |

文字列の保存について

1sagamat:2024/06/21(金) 23:41:20
うつぼかずら様

以前「波形描画ビューのその後」というスレッドでいろいろとご教授いただいたものです。その節は大変お世話になりました。おかげ様で作成したプラグインは機嫌よく動作しているのですが、1点だけうまくいっていないことがございます。プラグイン内の文字列データを保存しておきたいのですが、DAWを閉じて再度開くと文字列に不要な文字が追加されてしまうことがあります。この原因を調べているのですが、解決できずにおります。

保存したい文字列はstd::string型のdataText、その長さをint型のdataTextLen = dataTextLength()でcontroller.cpp内で保持しております。これらの値の保持のため、getState関数内で
state->write(&dataTextLen, sizeof(int));
state->write((void*)dataText.c_str(), sizeof(char) * dataTextLen);
と記述しており、読込用にはsetState関数内で
state->read(&dataTextLen, sizeof(int));
char* tmpText = new char[dataTextLen];
state->read(tmpText, sizeof(char) * dataTextLen);
dataText = std::string(tmpText);
delete[] tmpText;
と記述しています。

このdataTextをプラグイン内で表示しているのですが、保存したいデータが「a.wav」だったとして、DAWを再起動すると「a.wavv」とか「a.wavs」とか、もしくは文字化けした複数の文字が追加されることがあります。

何かwrite, read文やその他の記述でおかしいところがございますでしょうか?または、その他気をつけなければならない点などございますでしょうか?お時間の許す際にアドバイスを頂戴できますと大変助かります。何卒よろしくお願い申し上げます。

2管理人★:2024/06/22(土) 11:26:47
sagamatさん

書き込まれた文字列の最後がNULL(\0)で終端されていないのが原因だと思います。
書き込む際にNULL(\0)まで含めて書き込むか、読み込む際にNULL文字を追加すればよいと思います。

例1 NULL文字まで書き込む
dataTextLen =dataTextLen + 1; // NULL終端文字まで含めるため+1する
state->write(&dataTextLen, sizeof(int));
state->write((void*)dataText.c_str(), sizeof(char) * dataTextLen);

例2 NULL文字を追加できるよう、tmpTextを1文字多くする。
char* tmpText = new char[dataTextLen+1];
memset(tmpText, 0 sizeof(char) * (dataTextLen+1)); // tmpTextをNULL文字で埋める
state->read(tmpText, sizeof(char) * dataTextLen);
dataText = std::string(tmpText);

3sagamat:2024/06/22(土) 18:33:43
うつぼかずら様

的確なアドバイス、まことにありがとうございます。
ばっちり改善されました。ありがとうございます!!!


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板