Armadilloフォーラム

設定ファイルへランダムアクセスによる読み書き

ishikawa

2014年7月10日 15時57分

ミタニです。
お世話になっております。

現在Armadillo-440を使用して、設定ファイルを読み書きするCプログラムを作成しています。
1テキストのみの読み書きは「read」「write」で実現できているのですが、設定が多くあるため1つの設定ファイルにまとめたいと思っています。
windowsでよく使用する「iniファイル」のような形で、キーとなる設定に対してランダムアクセスで読み書きするには、どのように記述すればよいでしょうか?
初歩的な質問で申し訳ありませんが、色々と方法を探したのですが見つからず、ご教授いただけると助かります。

以上、よろしくお願いいたします。

コメント

izawa

2014年7月10日 16時15分

こちらをどうぞ。
http://okwave.jp/qa/q740866.html

まぁ、fopen()で開いてfgets()で一行読み込んで、sscanf()でばらすのが定番でしょうか。
私のところでは、ばらす部分はこんな感じです。

        char lh[40];
        char rh[40];
        if (sscanf(line, "%39[A-Za-z0-9_#] = %39[^\r\n]", lh, rh) == 2) {
            // 内部データへの登録処理
        }

あぁ、勿論fclose()するのも忘れずに。

at_takenoshita

2014年7月10日 16時32分

竹之下です。

コードが少し複雑になってしまいますが、GLib[*1]を使うと ini 形式のファイルの読み書きができます。

Armadillo実践開発ガイドでは、下記で解説されています。
6.3.2. 設定ファイルに対応する
http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-2…

*1: GLibのざっくりとした説明は下記などが参考になるかと思います。
http://www.ibm.com/developerworks/jp/linux/library/l-glib/

ishikawa

2014年7月11日 15時55分

Glibの情報いただきまして、ありがとうございます。
今回はイメージファイルをなるべく小さく作りたいので、まずは自作ソースで対応してみます。
難しい場合は、Glibも使ってみたいと思います。

> 竹之下です。
>
> コードが少し複雑になってしまいますが、GLib[*1]を使うと ini 形式のファイルの読み書きができます。
>
> Armadillo実践開発ガイドでは、下記で解説されています。
> 6.3.2. 設定ファイルに対応する
> http://manual.atmark-techno.com/armadillo-guide/armadillo-guide-2_ja-2…
>
> *1: GLibのざっくりとした説明は下記などが参考になるかと思います。
> http://www.ibm.com/developerworks/jp/linux/library/l-glib/
>

ishikawa

2014年7月11日 15時53分

ミタニです。

情報ありがとうございます。
fgets()など使って、試してみます。
サンプルソースまでいただき、参考になりました。

> こちらをどうぞ。
> http://okwave.jp/qa/q740866.html
>
> まぁ、fopen()で開いてfgets()で一行読み込んで、sscanf()でばらすのが定番でしょうか。
> 私のところでは、ばらす部分はこんな感じです。
>

>         char lh[40];
>         char rh[40];
>         if (sscanf(line, "%39[A-Za-z0-9_#] = %39[^\r\n]", lh, rh) == 2) {
>             // 内部データへの登録処理
>         }
> 

> あぁ、勿論fclose()するのも忘れずに。

nakayama.junichi

2014年7月11日 17時02分

中山と申します。

> 現在Armadillo-440を使用して、設定ファイルを読み書きするCプログラムを作成しています。
> 1テキストのみの読み書きは「read」「write」で実現できているのですが、設定が多くあるため1つの設定ファイルにまとめたいと思っています。
> windowsでよく使用する「iniファイル」のような形で、キーとなる設定に対してランダムアクセスで読み書きするには、どのように記述すればよいでしょうか?

一般的な方法は竹之下さんたちの言われるような方法になるのだと思います。
私自身、fgets()でファイルを一行ずつ読み込み、sscanf()で解析する
というベタなやり方をしています。

私は実践したことがない方法なのですが、
「Linuxネットワークプログラミングバイブル」
http://www.amazon.co.jp/dp/4798028622/
という本の528ページあたりに
「設定ファイルの読み込み」
というセクションがあり、
ここでは、字句解析ツールのflexと構文解析ツールのbisonというツールを使って
設定ファイルを解析するコードを生成するという手法が説明されています。
yyparse()という名前のC関数のコードが出力され、
アプリケーション側でそれを呼び出す形になるようです。
あまり一般的な手法ではなさそうな気がしますが、
厳密さを追求すると、こういうやり方になるのかなと思いました。

ishikawa

2014年7月14日 14時17分

ミタニです。

本まで紹介いただき、ありがとうございます。

最終的に、読み込みはfscanfでEOFまでループする方法に落ち着きました。
書き込みは、fprintfで全設定を再書き込みすることにしました。
設定が多かったので一部設定のみ書き戻したかったのですが、今回はこの方法で対応しました。

> 中山と申します。
>
> > 現在Armadillo-440を使用して、設定ファイルを読み書きするCプログラムを作成しています。
> > 1テキストのみの読み書きは「read」「write」で実現できているのですが、設定が多くあるため1つの設定ファイルにまとめたいと思っています。
> > windowsでよく使用する「iniファイル」のような形で、キーとなる設定に対してランダムアクセスで読み書きするには、どのように記述すればよいでしょうか?
>
> 一般的な方法は竹之下さんたちの言われるような方法になるのだと思います。
> 私自身、fgets()でファイルを一行ずつ読み込み、sscanf()で解析する
> というベタなやり方をしています。
>
> 私は実践したことがない方法なのですが、
> 「Linuxネットワークプログラミングバイブル」
> http://www.amazon.co.jp/dp/4798028622/
> という本の528ページあたりに
> 「設定ファイルの読み込み」
> というセクションがあり、
> ここでは、字句解析ツールのflexと構文解析ツールのbisonというツールを使って
> 設定ファイルを解析するコードを生成するという手法が説明されています。
> yyparse()という名前のC関数のコードが出力され、
> アプリケーション側でそれを呼び出す形になるようです。
> あまり一般的な手法ではなさそうな気がしますが、
> 厳密さを追求すると、こういうやり方になるのかなと思いました。
>