WritePrivateProfileString没有向末尾添加属性

时间:2012-07-12 12:15:56

标签: c++ winapi writefile

我正在使用WritePrivateProfileString函数在ini文件中编写一些属性,一切正常,但是当我添加多行文本时,就会出现问题。

这是代码和输出。

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

我的代码有什么问题?

2 个答案:

答案 0 :(得分:4)

我强烈建议您仔细阅读问题on Michael Kaplan's blog

如果您必须使用INI文件,请不要使用您现在使用的已弃用的Win32 API函数。它们是错误的,并且肯定不会再被修复为they are deprecated

而是使用SimpleIni为C ++创建一个非常体面的INI读/写器跨平台实现。

微软(作为一个整体)似乎不确定他们是否更喜欢使用注册表或其他机制来存储配置数据。在某些时候它是INI文件,然后它是注册表(对我来说是一个优越的机制)然后它似乎转向XML和其他基于文件的存储机制。当然,您的用例将定义您需要的内容,但请考虑使用这些已弃用的函数时的所有注意事项,并且至少要考虑使用INI文件的替代机制(如果必须)。

答案 1 :(得分:3)

看到这不是API函数的INI文件的正确格式,您期望什么?

ini文件的格式为:

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

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

如果要使用ini API调用,则必须遵循该格式。 您希望城市,街道和房屋成为City项目的一部分吗?然后将它们全部放在“同一行”上,并使用一个分隔符,稍后您可以为每个字段解析它。您可以使用逗号,管道或其他任何不属于文本的内容。