如何获得ini文件或文本文件 小节名 之间的内容

free160 2013-11-20 12:16:44
获得ini文件小节名->键内容这个会的,如下
[test]
username = 111

以上没什么问题,现在想知道这样的问题,我想获得以下[test1][test2]下面的内容,如何获得,最好有现成的类最好了。
[test1]
test1内容
test1内容
test1内容
test1内容
[test2]
test2内容
test2内容
test2内容
test2内容
test2内容
...全文
186 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
free160 2013-11-20
  • 打赏
  • 举报
回复
CString Cini::ReadSectionString(CString section1,CString section2,char *filename)
{
	CHAR FilePath[255];
	GetModuleFileName(NULL,FilePath,255);
	(strrchr(FilePath,'\\'))[1] = 0;
	//strcat(FilePath,filename);
	strcat_s(FilePath,filename);

	CStdioFile fTargetFile;
	CString strResult = "";
	CString strReadFileString;

	if(fTargetFile.Open(FilePath, CFile::modeRead) == TRUE)		//打开文件成功
	{
		while( fTargetFile.ReadString(strReadFileString) != FALSE )	//读取一行文本
		{
			// 判断要读取节点开始位置
			if ( strReadFileString == section1 )
			{
				while( fTargetFile.ReadString(strReadFileString) != FALSE )
				{
					// 如果指定节点2为空,则一直读取到文件最后
					if ( section2 != "" && strReadFileString == section2 )
					{
						break;
					}
					strResult += strReadFileString + "\r\n";
				}
				break;
			}
		}
	}     
	else															//打开文件失败
	{
		strResult = "";
	}
	fTargetFile.Close();											//关闭文件
	return strResult;
}
free160 2013-11-20
  • 打赏
  • 举报
回复
已经这样实现了,还是谢谢大家 CString Cini::ReadSectionString(CString section1,CString section2,char *filename) { CHAR FilePath[255]; GetModuleFileName(NULL,FilePath,255); (strrchr(FilePath,'\\'))[1] = 0; //strcat(FilePath,filename); strcat_s(FilePath,filename); CStdioFile fTargetFile; CString strResult = ""; CString strReadFileString; if(fTargetFile.Open(FilePath, CFile::modeRead) == TRUE) //打开文件成功 { while( fTargetFile.ReadString(strReadFileString) != FALSE ) //读取一行文本 { // 判断要读取节点开始位置 if ( strReadFileString == section1 ) { while( fTargetFile.ReadString(strReadFileString) != FALSE ) { // 如果指定节点2为空,则一直读取到文件最后 if ( section2 != "" && strReadFileString == section2 ) { break; } strResult += strReadFileString + "\r\n"; } break; } } } else //打开文件失败 { strResult = ""; } fTargetFile.Close(); //关闭文件 return strResult; }
free160 2013-11-20
  • 打赏
  • 举报
回复
引用 7 楼 fengqinqdca 的回复:
[quote=引用 6 楼 free160 的回复:] [quote=引用 5 楼 fengqinqdca 的回复:] CString sPath=_T(""); ::GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); sPath=sPath.Left(sPath.ReverseFind('\\')); sPath += _T("\\version.ini"); TCHAR chSectionNames[2048]={0}; TCHAR *pSectionName=NULL; int i,j=0; ::GetPrivateProfileSectionNames(chSectionNames,2048,sPath); for(i=0;i<2048;i++,j++) { if(chSectionNames[0]=='\0') break; if(chSectionNames[i]=='\0') { pSectionName=&(chSectionNames[i-j]); j=-1;   ////////////////////////////////////////////////////////////   ///  you want to do!!!!!   //////////////////////////////////////////////////////////// if(chSectionNames[i+1]==0) { break; } } } 红色是你需要添加的代码
这个好像只获取了[test1][test2] 2个标签啊,。我需要下面的内容[/quote] 代码都给你了,你就不会在红色区域动动脑子GetPrivateProfileString获取键值的内容吗?里面有多项,那你就循环取值就O了.[/quote] 这个复杂了点,而且GetPrivateProfileString也只能获取到键后面的值,即使键为NULL,得到所有的,还会被\0隔开,这个不太好。 自己写了一个函数,不过还是谢谢你了
华美乐章 2013-11-20
  • 打赏
  • 举报
回复
引用 6 楼 free160 的回复:
[quote=引用 5 楼 fengqinqdca 的回复:] CString sPath=_T(""); ::GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); sPath=sPath.Left(sPath.ReverseFind('\\')); sPath += _T("\\version.ini"); TCHAR chSectionNames[2048]={0}; TCHAR *pSectionName=NULL; int i,j=0; ::GetPrivateProfileSectionNames(chSectionNames,2048,sPath); for(i=0;i<2048;i++,j++) { if(chSectionNames[0]=='\0') break; if(chSectionNames[i]=='\0') { pSectionName=&(chSectionNames[i-j]); j=-1;   ////////////////////////////////////////////////////////////   ///  you want to do!!!!!   //////////////////////////////////////////////////////////// if(chSectionNames[i+1]==0) { break; } } } 红色是你需要添加的代码
这个好像只获取了[test1][test2] 2个标签啊,。我需要下面的内容[/quote] 代码都给你了,你就不会在红色区域动动脑子GetPrivateProfileString获取键值的内容吗?里面有多项,那你就循环取值就O了.
free160 2013-11-20
  • 打赏
  • 举报
回复
引用 5 楼 fengqinqdca 的回复:
CString sPath=_T(""); ::GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); sPath=sPath.Left(sPath.ReverseFind('\\')); sPath += _T("\\version.ini"); TCHAR chSectionNames[2048]={0}; TCHAR *pSectionName=NULL; int i,j=0; ::GetPrivateProfileSectionNames(chSectionNames,2048,sPath); for(i=0;i<2048;i++,j++) { if(chSectionNames[0]=='\0') break; if(chSectionNames[i]=='\0') { pSectionName=&(chSectionNames[i-j]); j=-1;   ////////////////////////////////////////////////////////////   ///  you want to do!!!!!   //////////////////////////////////////////////////////////// if(chSectionNames[i+1]==0) { break; } } } 红色是你需要添加的代码
这个好像只获取了[test1][test2] 2个标签啊,。我需要下面的内容
华美乐章 2013-11-20
  • 打赏
  • 举报
回复
CString sPath=_T(""); ::GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); sPath=sPath.Left(sPath.ReverseFind('\\')); sPath += _T("\\version.ini"); TCHAR chSectionNames[2048]={0}; TCHAR *pSectionName=NULL; int i,j=0; ::GetPrivateProfileSectionNames(chSectionNames,2048,sPath); for(i=0;i<2048;i++,j++) { if(chSectionNames[0]=='\0') break; if(chSectionNames[i]=='\0') { pSectionName=&(chSectionNames[i-j]); j=-1;   ////////////////////////////////////////////////////////////   ///  you want to do!!!!!   //////////////////////////////////////////////////////////// if(chSectionNames[i+1]==0) { break; } } } 红色是你需要添加的代码
free160 2013-11-20
  • 打赏
  • 举报
回复
引用 3 楼 sfhjy 的回复:
用windows api GetPrivateProfileString
GetPrivateProfileString 只能得到常规的 小节->键值啊,无法得到我上面说的情况啊
itachi777 2013-11-20
  • 打赏
  • 举报
回复
用windows api GetPrivateProfileString
5t4rk 2013-11-20
  • 打赏
  • 举报
回复
操作INI文件专用API 

GetPrivateProfileInt
GetPrivateProfileSection
GetPrivateProfileSectionNames
GetPrivateProfileString
GetPrivateProfileStruct
GetProfileInt
GetProfileSection
GetProfileString
WritePrivateProfileSection
WritePrivateProfileString
WritePrivateProfileStruct
WriteProfileSection
WriteProfileString

示例代码

http://blog.csdn.net/fengbingchun/article/details/6075716
天生的爬爬 2013-11-20
  • 打赏
  • 举报
回复
一行一行的读取; CFile 或者 CStdioFile 抽取[test1][test2]下面的内容

16,548

社区成员

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

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

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