プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

C++/CLIのファイル書き込みではまったこと。

f:id:paveway:20190914064630j:plain

はじめに

設定値がソース上にべた書きされている画面があったのですが、それを設定ファイルで外出ししてほしいと依頼があり対応しました。
要件としてはそんなに難しい要素はないためすぐ終わると思っていたのですが、書き込み処理ではまりました。

はまったこと

設定値は画面で変更可能なため、ファイルに保存する際に設定値の部分を上書きしようと考えました。
ところが最後のデータだけある条件でデータ化けが発生してしまいました。
このデータは小数値データだったのですが、有効桁数が小数点2桁と3桁のデータが混在していました。
有効桁数が3桁のデータを保存した後、2桁のデータを保存するとデータ化けしました。

原因はFileModeの設定

原因は書き込み用にファイルを開く際のFileModeの設定でした。
書き込み用にファイルを開く際、ファイルが存在しなくてもエラーにしたくなかったため、FileModeにOpenOrCreateを指定しました。
これによりファイルが存在しない場合はファイルは新規に作成され、ファイルが存在する場合は上書き保存になります。
問題はファイルの上書き保存の場合で、有効桁数小数点3桁のデータを書き込み後、有効桁数小数点2桁のデータを書き込むと、有効桁数小数点3桁で書き込まれた3桁目が残っている状態になっていました。

つまりこんな感じです。

  1. まず有効桁数小数点3桁のデータ"99.123"を保存します。
  2. 次に有効桁数小数点2桁のデータ"99.45"を保存します。

すると"99.453"が保存されていました。

解決方法

書き込み用のファイルは常に新規保存にするように、FileModeでCreateを指定するように変更しました。
これにより、ファイルがあってもなくても常に新規保存されデータ化けも発生しなくなりました。

API Reference
FileMode

おわりに

久しぶりにドはまりして、問題解決まで数時間四苦八苦しました。
なんとか時間内に解決できてよかったですが、原因がわかってみればちょっと情けない感じです。

~約8,000名の受講生と80社以上の導入実績~
現役エンジニアのオンライン家庭教師CodeCamp

紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。


私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。

また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。

EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688