2

関数を使用してiniファイルにいくつかのプロパティを書き込んでいますがWritePrivateProfileString、すべて正常に動作しますが、複数行のテキストを追加すると問題が発生します。

コードと出力は次のとおりです。

WritePrivateProfileString(_T("General"), _T("Name"), OLE2CT(text), FilePath);

出力:

[General]
Name=mytext

.

text = address\nstreet\nhouse
WritePrivateProfileString(_T("General"), _T("Address"), OLE2CT(text), FilePath);

出力:

[General]
Name=mytext
Address=address
street
house

しかし、複数の項目を追加した後、別の項目を追加すると、これを最後に追加する代わりに、住所行の直後に新しい行が追加されます

text = city
WritePrivateProfileString(_T("General"), _T("City"), OLE2CT(text), FilePath);

出力:

[General]
Name=mytext
Address=address
City=city
street
house

しかし、出力は

[General]
Name=mytext
Address=address
street
house
City=city

私のコードの問題は何ですか?

4

2 に答える 2

4

Michael Kaplan のブログ で問題を確認することを強くお勧めします。

絶対に INI ファイルを使用する必要がある場合は、現在使用している非推奨の Win32 API 関数を使用しないでください。それらはバグが多く、現在では廃止されているため、バグが修正されることはありません。

代わりに、C++ 用の INI リーダー/ライターのクロスプラットフォーム実装であるSimpleIniを使用してください。

Microsoft (全体として) は、構成データを格納するためにレジストリまたはその他のメカニズムを好むかどうか確信が持てないようです。ある時点で、それは INI ファイルであり、次にレジストリであり (私には優れたメカニズムでした)、その後 XML やその他のファイルベースのストレージ メカニズムに移行したようです。必要なものを定義するのは確かにあなたのユースケースですが、これらの非推奨関数の使用に関するすべての注意事項を考慮し、必要に応じて INI ファイルを操作する代替メカニズムを少なくとも探してください

于 2012-07-12T12:31:54.860 に答える
2

これがAPI関数のINIファイルの適切な形式ではないことをよく理解して、あなたは何を期待しますか?

iniファイルの形式は次のとおりです。

[section]
item1=item1text
item2=item2text
...

[anothersection]
item1=item1text
item2=item2text
...

ini API呼び出しを使用する場合は、形式に準拠する必要があります。都市、通り、家を都市アイテムの一部にしたいですか?次に、それらすべてを「同じ行」に配置し、後で各フィールドに対して解析できるセパレーターを使用します。カンマ、パイプ、またはテキストの一部ではないその他のものを使用できます。

于 2012-07-12T23:46:42.527 に答える