0

これは哲学的な質問かもしれませんが、私は前のエンジニアによるコードをレビューしていて、iniファイルを読み取るのに最適な時期はいつか疑問に思っていました。現在のアプリケーションは、値が必要になるたびにiniファイルを再読み取りし、値が変更されるたびにデータを書き込みます。私の頭の中のより良い解決策は、それを一度読み書きして、その情報をメモリに保存することです。私は何かが足りないのですか?iniファイルには約40のエントリがあります。

また、エンジニアが独自のクラスを作成しましたが、これを実現するための既存のクラスはありませんか?

4

2 に答える 2

1

デフォルトでは、起動時に一度設定を読み取り、CEだけでなく他のシステムでも読み取ります。構成の変更に対応できるようにしたい場合は、プログラムにシグナルを送信するなど、明示的にリロードすることをお勧めします。CEでのシグナルがない場合は、名前付きイベントを使用するか、UIがあるかどうかをユーザーに尋ねることができます。それがすべて不足しているので、定期的にファイルのタイムスタンプを確認し、変更があった場合はファイルをリロードしますが、それでもコピーをメモリに保持します。

単一の値のファイルを開閉しない理由は、2つの値に依存関係がある場合があり、そうすると、古い値と新しい値がメモリに取り込まれ、不整合が発生する可能性があるためです。また、実際に使用を開始する前に、健全性の構成を検証します。とはいえ、単一の構成値を読み取るためだけにハードディスクにアクセスすることも、ひどく非効率的です。

変更の書き込みに関しては、ユーザーからの明示的な要求に応じて、または変更を受け入れた後に自動的に行います。それでも、単一の値を読み取らないのと同じ理由で、単一の値を書き込まないようにします。

最後に、INIファイルは廃止されたと宣言されているため、それらを読み書きするためのwin32APIはCEではサポートされていません。これは、誰かがこれらのファイルを読み書きするために独自のクラスをロールする理由を説明しています。MSは、APIが存在し、サポートされているレジストリを代わりに使用することを望んでいます。テキスト構成ファイル(必ずしもINIファイルは必要ありません)は、既存のテキストツールを使用する機能など、レジストリにはない機能を提供するため、ここでMSに同意することはできません。

于 2013-03-08T11:48:54.493 に答える
0

Boost.PropertyTreeライブラリを使用して、INIファイルの読み取りと書き込みを行うことができます。

INIファイルを読み取り、変更して保存するサンプルコードは次のとおりです。

#include <iostream>
#include <string>
#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/ini_parser.hpp>

/*
[owner]
name=John Doe
organization=Acme Widgets Inc.
*/

int main(int ac, char* av[])
{
    boost::property_tree::ptree pt;

    // Read
    read_ini("data.ini", pt);
    std::cout << pt.get<std::string>("owner.name") << std::endl; // John Doe
    std::cout << pt.get<std::string>("owner.organization") << std::endl; // Acme Widgets Inc.

    // Write
    pt.put<std::string>("owner.name", "New Name");
    pt.put<std::string>("owner.name", "New Organization");
    write_ini("date2.ini", pt);

    return 0;
}

注: Windows CEでこのコードをコンパイルする場合、Boost.PropertyTreeライブラリを調整する必要がある場合があります。WindowsCE用の標準C++ライブラリには<locale>ヘッダーがなく、Boost.PropertyTreeはINIファイルの読み取りと書き込みの際にヘッダーを使用しているようです。

于 2013-03-06T20:07:16.587 に答える