关于INI文件操作的奇怪现象

MITSMI 2006-07-31 12:41:33
我使用GetPrivateProfileString来读取INI文件中的内容,使用WritePrivateProfileString来写入。现在遇到一个比较奇怪的现象没有解决。

在读取的时候有的时候section中指定键的值读取不到,同时写入的时候有的时候会再生成同样的一个section,请问各位是什么原因?
我当时怀疑是Ini文件中有中文的缘故,后来发现不是。
另,我的程序是多线程的,以前也用过多线程操作过ini文件,好像没有遇到过这种事情。
多谢各位了!!!

[SYSTEM]
key=中国
......
[1]
key=.....

结果运行多次后变成了

[SYSTEM]
key=中国
......
[1]
key=.....
[SYSTEM]
key=中国
......
...全文
684 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
MITSMI 2006-08-05
  • 打赏
  • 举报
回复
发现有的时候还是不行,都要郁闷坏了,命名的mutex来同步访问还是有同样的问题
我顶你个肺啊!
yu_hl 2006-08-04
  • 打赏
  • 举报
回复
可以用一个命名的mutex来同步访问啊。
MITSMI 2006-08-04
  • 打赏
  • 举报
回复
MITSMI 2006-08-02
  • 打赏
  • 举报
回复
我这个不仅是需要多线程访问,而且需要多进程访问
思危 2006-08-01
  • 打赏
  • 举报
回复
我就被郁闷过一次,最后改静态的就好了
MITSMI 2006-08-01
  • 打赏
  • 举报
回复
看来我最好还是用Mutex
思危 2006-08-01
  • 打赏
  • 举报
回复
如果只有这几函数涉及ini文件操作的话,那我建议你将cs定义为类的静态成员变量,再试一下。

因为如果你定义了几个CIniFile对象的话, 临界段对象 cs 也会构造多个,EnterCriticalSection/LeaveCriticalSection完全起不到保护的效果。
wallimn 2006-07-31
  • 打赏
  • 举报
回复
这个应该跟并发访问有关系吧。不知GetPrivateProfileString、WritePrivateProfileString读写是个什么机制,我用那个总是在单线程里用,没有发生过你说的问题。
至于你的问题,我想可以用两种方法来解决:1.做个互斥量或者信号量进行访问控制,只对允许一个线程访问INI文件。2.呢,是否可以考虑把INI分成两个或多个文件。
lixiaosan 2006-07-31
  • 打赏
  • 举报
回复
很明显,这是个线程同步的问题

http://www.vckbase.com/document/viewdoc/?id=804
rageliu 2006-07-31
  • 打赏
  • 举报
回复
多线程互斥读写应该就没事了
aa3000 2006-07-31
  • 打赏
  • 举报
回复
帮顶一下
Pipi0714 2006-07-31
  • 打赏
  • 举报
回复
读写的时候用临界区同步。
InitializeCriticalSection

EnterCriticalSection
MITSMI 2006-07-31
  • 打赏
  • 举报
回复
上述代码有问题否?
MITSMI 2006-07-31
  • 打赏
  • 举报
回复
CIniFile::CIniFile()
{
InitializeCriticalSection(&cs);
}

CIniFile::~CIniFile()
{
DeleteCriticalSection(&cs);
}

BOOL CIniFile::WriteINIString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString
)
{
BOOL result = FALSE ;
EnterCriticalSection(&cs);

result = ::WritePrivateProfileString(lpAppName,lpKeyName,lpString,m_szIniPath) ;

LeaveCriticalSection(&cs);

return result ;
}

DWORD CIniFile::GetINIString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize
)
{
DWORD result = 0 ;

EnterCriticalSection(&cs);

result = ::GetPrivateProfileString(lpAppName,lpKeyName,lpDefault,lpReturnedString,nSize,m_szIniPath) ;

LeaveCriticalSection(&cs);
return result ;
}

UINT CIniFile::GetINIInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault
)
{
UINT result = 0 ;
EnterCriticalSection(&cs);

result = ::GetPrivateProfileInt(lpAppName,lpKeyName,nDefault,m_szIniPath) ;

LeaveCriticalSection(&cs);

return result ;
}
ldsjlzy 2006-07-31
  • 打赏
  • 举报
回复
GetPrivateProfileString和WritePrivateProfileString用你得到的路径
ldsjlzy 2006-07-31
  • 打赏
  • 举报
回复
将ini放入模块所在目录然后
::GetModuleFileName(::AfxGetInstanceHandle (),curdir.GetBuffer (_MAX_PATH),_MAX_PATH);
获取你的模块路径,再读写试试
rageliu 2006-07-31
  • 打赏
  • 举报
回复
同步<->互斥
iryuiu1 2006-07-31
  • 打赏
  • 举报
回复
mark
MITSMI 2006-07-31
  • 打赏
  • 举报
回复
刚试了一下线程同步的方法
还是不行,看来问题不在这上面。

debug跟踪,getlasterror发现“系统找不到指定的文件”?
不知道是什么原因,文件肯定存在!

此时再writeprivateprofilestring的话就会添加同样的内容

各位帮我分析分析,多谢了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧