• ベストアンサー

iniファイルに追記がしたいです。

 いつもお世話になっています。  iniファイルの中のあるデータをGetPrivateProfileStringで調べて、その中になければデータを  追記したいです。  WritePrivateProfileStringの場合、iniファイルにあるデータが追記したい内容がないだけで、他のデータが 入っていても、上書きされてしまうんですよね?  もしその中に他のデータが入っていた場合は、追記をしたいのですが、それができるAPI関数って  何かありますか?  iniファイルに関して、ネットで調べていると、WritePrivateProfileStringなどしか出てこなくて・・・。  もしできないようでしたら、追記できるような何かいいアイディアがあれば・・・と思っています。  すみませんが、よろしくお願いします。  わかりづらい文章で申し訳ありません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

> 形は、普通のiniファイルの >"WriteData=OldData" >"WriteData=NewData"にしたいので・・・。 ということであれば、それはWritePrivateProfileStringでは出来ません。(INIファイルの規格外の使い方だから) また、GetPrivateProfileStringでは最初のOldDataしか取得できません。(試してないので推測です) そこで ・設定ファイル(INI)にキーと値をまとめて書き込む(WritePrivateProfileSection) ・設定ファイル(INI)からキーと値をまとめて読み込む(GetPrivateProfileSection) を使えば出来ると思います。 つまり、 strPair = _ "OtherKey=" & strOtherData & vbNullChar & _ "WriteData=" & strOldData & vbNullChar & _ "WriteData=" & strNewData & vbNullChar & vbNullChar として書きこむ文字列を作成し(#5の方の配列による方法が使えます) lngRet = WritePrivateProfileSection( SectionName, strPair, InifaileName ) で書きこみます。 ただし、書きこんだ"WriteData"の値をすべて読み出す場合は GetPrivateProfileSectionを使ってセクション内の文字列を読み出してから 自力でキーと値に分離する必要があります。(Split命令が有るのでそんなに大変じゃないけど) WritePrivateProfileSectionやGetPrivateProfileSectionの使い方についてはMSDNやインターネットで調べてください。

その他の回答 (6)

  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.7

BlueRayです。 >セクション(?)/エントリ(?)内のキーはユニーク 前回、上記のように書き込み詳しく書いてなかったのですが No.5,6さんの言う通りのことが言いたかったのです。 言い訳になりますが、時間が無かったので簡単に書いてしまいました。 [Section] Key = Value となってる場合に、Key名はユニークと言うことです。 [TEST] TEST1 = 1  ○ TEST1 = 2  × TEST1 = 3  × GetPrivate~/WritePrivate~は、上記のように同一名称は 無視されるので、記述はしていても有効にはなりません。 >2番目の引数lpKeyNameが同じでも3番目の引数のlpStringが違えば記述されていますが・・・。 > (元からあるiniファイルの話で、プログラム上でいじくっているわけではありませんが・・・。 これは、Open/Closeを使用して直接読み書きしていると思われます。 一応、こちらからの補足をさせていただきました。 方法は、No.5,6さんの案を適用すれば出来るはずです。 では。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.5

TEST.iniファイルにブロックとセクションを追加する場合は以下のとおりでOKなはずです。 Open "TEST.ini" For Append As #1 Print #1, "[BlockName]" Print #1, "SectionName = Section" Close #1 ただし、 [BLOCK1] SectionName = A SectionName = B と設定しても、最初の行しか有効になりません。ですから設定されるのであれば、別ブロックで設定しないと「A」が「B」に書き換えられてしまうわけです。 この場合は [BLOCK1] SectionName = A [BLOCK2] SectionName = B としなければ、両方設定することは出来ません。 また、iniファイル全体を編集したいのであれば Dim strLine(100) as string Dim i as Long dim j as Long Open "ETST.ini" For Input As #1  i=0  do untile eof   i = i + 1   input #1,strLine(i)  loop Close #1 で配列等に保存し、プログラムで文字列を編集してから Open "TEST.ini" For Output As #1  For j= 1 to i   Print #1,strLine(j)  Next Close #1 で書き出せば出来るはずです。

hema123
質問者

補足

 わざわざ細かい説明ありがとうございました!!  どうしても同じキー名のところに設定したいので、2番目の配列を利用するやり方を  考えてみようと思います。  私が実際思いついたやりかたといえば、キー名を指定しないで、値にキー名+値を  追記しするか、拡張子をテキストに変えて文字列操作するとかくらいしか  思いつきませんでした。  ちなみにキー名を指定しないで追記すると、値の前にどうしても"="が入ってしまうので、  どうしようか途方にくれてました。  あと、ふたつめの拡張子を変えるっていうのはアイディアだけで、  実際にそのやり方はわかりません。  

回答No.4

追記して、どのようにしたいのかが不明なのですが 登録されている値をOldData、 追記したい値をNewData、 実際に書きこまれる値をWriteDataとすると WriteData = OldData & Newdata というのではダメですか?

hema123
質問者

補足

 ”キー名=値+値”にするってことですか?  それはちょっと考えていないので・・・すみません。  形は、普通のiniファイルの "WriteData=OldData" "WriteData=NewData"にしたいので・・・。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.3

はじめまして。 iniファイルはただの、テキストファイルと同じですから、テキストファイルの編集と同じようやってみたらいかがでしょう?

hema123
質問者

補足

 テキストファイルと同じように編集・・・。  それはAPI関数を使うとしたら、どのような関数を使うことになりますか?  VBの関数でもできるのでしたら、その方が良いんですが・・・。

  • BlueRay
  • ベストアンサー率45% (204/453)
回答No.2

INIファイルの記述は、セクション(?)/エントリ(?)内のキーはユニークで なくてはならないので、重複したキー名称を指定することは出来ません。 参考資料が見つけられなかったのですが、以上のようになっています。

hema123
質問者

補足

 え?そうなんですか?  2番目の引数lpKeyNameが同じでも3番目の引数のlpStringが違えば記述されていますが・・・。  (元からあるiniファイルの話で、プログラム上でいじくっているわけではありませんが・・・。   ”重複したキー名称を指定することはできない”とは、プログラム上での話ですか?)。  さきほど、補足で書いたのが2番目の引数が“セクション名”と書きましたが、2番目はキー名の間違えでした。  

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

追記されると思いますが・・・。

参考URL:
http://www36.tok2.com/home/np/vb/api/wpps.html
hema123
質問者

補足

 takntさんから追記されるとのご指摘がありまして、早速試しましたが、やはり上書きされました。  私がやりたいことは、WritePrivateProfileStringの2番目の引数のセクションが追記したいものと  元からあるものが同じときに、上書きせずに追記したい・・・という話なんです。  WritePrivateProfileStringの場合、2番目の引数のセクションが同じ場合、3番目の引数の値が上書きされてしまいますよね?  説明不足で申し訳ありません。

関連するQ&A

  • INIファイルへの保存について

    いつもお世話になります。 指定場所のINIファイルにウィンドウが閉じられた時の 座標位置を保存しようとしています。 API関数をMFCの中で用いたいのですが、現時点の知識量では 下記程度のソースしか思い浮かびません。 ネット上などいろいろ調べてみたのですが、 わからずじまいです。 ご教授よろしくお願い致します。 開発環境はVC++6.0MFCです。 CRect q; GetWindowRect(&q); WritePrivateProfileString("PROGRAMDATA", "WindowPlaceL", q.left,"INIファイルへのフルパス"); WritePrivateProfileString("PROGRAMDATA", "WindowPlaceT", q.top,"INIファイルへのフルパス");

  • INIファイルの読込みについて

    VB2005を使用しています。 INIファイルを読み込む関数で、GetPrivateProfileStringとGetPrivateProfileIntがありますが、この二つは文字列用、数値用と、なんとなく曖昧に憶えておりました。VBでINIファイルを読み込んだ場合、どちらも文字列、数値として取得できてしまうのですが、1つのプロジェクトでこれらを使い分ける意味はあるのでしょうか? できれば一つの関数で読込みを統一したいと思うので。。。 使い分ける意味があるとしたら、その理由についてもできれば教えてください。宜しくお願いいたします。

  • iniファイルへの追記について

    FORM上の保存ボタンをクリックしたら、フォームに入力したデータがiniファイルへ追記していくというものを作りたいのですがわかりかねています。 フォームのソースで作っていこうとしていて、 ソースの始めは public sub Command保存_Click() で始まり、End sub で終りますよね? そこで フォーム上の値、例えば、3 を変数 a_col に格納します。ここまではできます。 この格納したものをiniファイルと同じものをあらわす名前のini_colに格納し、iniファイルに ini_col=3と表示したいのです。 iniファイルから、フォームへ取り込むところまではなんとかできました。 初心者ですのでアドバイスおねがいします。

  • 独自INIファイルの操作をしたいんですが

    phpでaaa.iniの操作をしたいのですが 例えば [section] key1=aaaaa の「aaaaa」を書き換えたいのです。 (力量不足もありますが) 項目が複数あるので単純なfwriteでは対応できそうになく 出来れば win32apiのWritePrivateProfileStringのような 動かし方が出来ればいいのですが 読み込みは parse_ini_fileで出来そうなのですが 更新の方は方法が見つからなくて よろしくお願いします。

    • ベストアンサー
    • PHP
  • xxx.iniファイルのデータ消去について

    よろしくお願いいたします。 アプリ終了時にWritePrivateProfileString(aaa,"X",szBuffer,"d:\\kado.ini");を使ってデータを書きこんでいます。 書きこむデータ数が一定ではないため、書きこむ前にデータを一旦消去したいのですが、そのような関数はあるのでしょうか? ご存知でしたらお教えください。 # 今は通常のファイルオープン if((fout=fopen("d:\\kado.ini","w"))==NULL) ・・・ で処理をしているのですが、WritePrivateProfileStringでの書きこみが出来るときと出来ないときが繰り返しで発生する不具合が生じています。

  • iniファイル内の行を削除する方法

    iniファイルの使い方自体を間違えているのかも知れませんが、 わからないので教えてください。 VB6でiniファイルを作成しています。 使用しているAPIは「WritePrivateProfileString」です。 iniファイルの内容が以下のようにあったとします。 これは上記のAPIで出力しています。 [a] a1=xxxx a2=yyyy a3=zzzz プログラムでiniファイルを読み込み、 画面上である操作をしたとして、iniファイルを更新します。 結果、以下のような内容にするには、どのようにしたらよいのでしょうか。 [a] a1=xxxx a2=zzzz a1、a2を出力するところまではできるのですが、 a3の行を削除する方法がわかりません。 もしAPIでこの行を削除する方法がなければ、 iniファイルを削除して、再作成すればよいのだと思います。 その際には、iniファイルを削除するAPIがあるのでしょうか。 KillステートメントやOpenステートメントを使うのが一般的なのでしょうか。 よろしくお願いいたします。

  • INIファイル 構成ファイル反映方法

    見て頂きありがとうございます 昨日も投稿させて頂き、Webサイト等教えていただき勉強をしているのですが、文字列を読み込み メッセージとして表示は出来るようになったのですが、その情報を起動時に反映させる方法がわからなく 再度投稿させて頂きました HPなどで 見て API宣言はわかったのですが 反映方法などアドバイス頂けると助かります やりたい事 Accessにて メインフォームを起動時にINIファイル読み込み COMMポートが開いていたら 起動 開けなかったら ←INIファイル読み込み失敗したら メッセージを 出す  INIファイル PortNum=COM4 標準モジュールでAPI宣言 GetPrivateProfileString と GetPrivateProfileint を宣言 メインフォームを起動時に INIファイル読み込みを行う場合 どこに プログラムを書けば宜しいのでしょうか? VB一ヶ月前後の知識で わかりにくい、的外れな質問が多いかとは 思いますが お力を貸していただけると 本当に助かります 

  • INIファイルの読み書きをするには?

    お世話になります。WindowsXP/Cで開発している初心者です。 開発はwindowsでしておりますが、最終的にはlinuxで動作させます。 質問させていただきたい件ですが INIファイルの読み込み、書き込みをするには、どういった方法(関数?)がありますでしょうか。 ネットで調べておりますが、見つけられずにいます。 windows.hをインクルードし、おなじみのGetPrivateProfileStringを実行すると windows上ではコンパイルが通りますが、linuxではヘッダーファイルが存在しないと エラーが出ます。(当たり前だと思いますが) ご存知の方、いらっしゃいましたら、ご指導願います。 宜しくお願い致します。

  • GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

    お世話になっています。 iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。 このサイトの投稿や、MSDNなどにも載っていたのですが、 少し理解に苦しみます。 現在まで、理解した点がwindows.hのインクルードを 記述するところ辺りです。 iniファイルは下記のようなレイアウトです。 ---<mst.ini>---------------------------- [user] name=username ID=userid [pc] pcname=FMV ---------------------------------------- #include<windows.h>は記述することまでは 分かりましたが、以下から進みません。。。 GetPrivateProfileString("") 初心者で申し訳ありませんが、お助け願います。

  • INIファイルとAPP.CONFIGについて

    INIファイルとAPP.CONFIGとでは、どちらの読み込みが早いでしょうか? ちなみにINIファイルは、APIでの読み込み処理で、取得については、パラメータをひとつ取得する場合を想定します。 ご回答、よろしくお願いします。

専門家に質問してみよう