文章目录:
- 1、MFC中CString赋值出错
- 2、mfc unicode 获取网页源码乱码如何解决
- 3、c++ cstring排序源码
- 4、请各位C++高手帮忙修改一下下面的源代码,谢谢!
- 5、MFC CFileFind和CFile遍历一个指定文件夹并删除里面的所有文件(里面没有下层文件夹目录)问题
- 6、有CString数据的类的复制构造函数应该怎么写
MFC中CString赋值出错
不是不能赋值,这讲起来内容就多了,涉及到C++底层的一些知识。
你现在这种用法是把struct ABC当做一种数据结构来用,当然针对struck结构
ABC *p=(ABC*)malloc(sizeof(ABC));
p-str=s;
这种用法是无可厚非的,毛病出在你在这个struck里定义了一个类对象CString,
在C++有关构造函数的知识里,一个类A里如果包含有B类的对象,那么在这个A类定义对象时,编译器会在A类的构造函数里调用B的构造函数。
好了,矛盾出来了,struct ABC你是当结构体用的,没有所谓的构造函数,那么结构体里的str就没被构造,所以就会出现很多问题,具体出在哪我也不知道,那得去看CString源码。
由此,有二种改法,一个是把malloc改成new,一个是把CString改成内置类型,比如说char
mfc unicode 获取网页源码乱码如何解决
返回的结果需要进行转换一下,如下:
CString adr = _T("网址");
CString text = GetHttpFileData(adr);
USES_CONVERSION;
LPSTR pStr = (LPSTR)text.GetBuffer();
LPTSTR ptStr = A2T(pStr);
text.ReleaseBuffer();
MessageBox(ptStr);
运行结果:
c++ cstring排序源码
#includevector
#includestring
#includeiostream
using namespace std;
struct string3
{
string str1;
string str2;
string str3;
string3(const char* s1,const char* s2,const char* s3):
str1(s1),
str2(s2),
str3(s3)
{};
};
bool scom(string3 lhs,string3 rhs)
{
if (lhs.str1!=rhs.str1)
return lhs.str1rhs.str1;
if (lhs.str2!=rhs.str2)
return lhs.str2rhs.str2;
return lhs.str3rhs.str3;
};
int main()
{
vectorstring3 vs;
string3 tmp("sdfsd","2316","4587");
vs.push_back(tmp);
tmp.str1="PPPP";
vs.push_back(tmp);
tmp.str3="3333";
vs.push_back(tmp);
tmp.str2="0000";
vs.push_back(tmp);
vectorstring3::iterator iter;
cout"排序前:"endl;
for(iter=vs.begin();iter!=vs.end();++iter)
cout(*iter).str1"\t"(*iter).str2"\t"(*iter).str3"\t"endl;
sort(vs.begin(),vs.end(),scom) ;
cout"排序后:"endl;
for(iter=vs.begin();iter!=vs.end();++iter)
cout(*iter).str1"\t"(*iter).str2"\t"(*iter).str3"\t"endl;
return 0;
}
请各位C++高手帮忙修改一下下面的源代码,谢谢!
由于不知道你是想测试什么东西,所以只能把一些错误找到!
其余的靠你自己了啊!!
#include iostream
#include cstring
using namespace std;
struct stringy
{
char *str;
int ct;
};
void set(stringy st,char ps[]);
void show(stringy st,int n=1);
void show(char *ps, int n=1);
int main()
{//不知道你这些是什么功能啊!!!有点乱
stringy beany;
char testing[]="Reality isn't what it used to be.";
set(beany,testing);
show(beany);
show(beany,2);
testing[0] = 'D';
testing[1] = 'u';
show(testing);
show(testing,3);
show("Done! " );
return 0;
}
void set(stringy st,char ps[])
{
int len = strlen(ps);
st.str = new char[len+1]; //因为字符串结尾是有默认的附加'\0',所以多加一个
strcpy(st.str,ps);
coutst.str endl;//这句就可以看出已经赋值了!!
st.ct = len;
delete [] st.str; //这里就去掉的话,意思就是把存过去的东西又去掉了!
return;
}
void show(stringy st,int n)
{
for(int i=0;in;i++) //这些for循环语句不知道作用
{
cout *st.str endl; //这里要加个*不然不是只把地址输出了啊!!!
cout st.ct endl;
}
}
void show(char *ps, int n)
{
for(int i=0;in;i++)
cout ps endl;
}
MFC CFileFind和CFile遍历一个指定文件夹并删除里面的所有文件(里面没有下层文件夹目录)问题
首先鄙视一下楼主的代码 毫无章法 乱定义变量 居然还不按同一风格定义
其次 你写的这玩意 我不知道 你是想学习字符转换呢 还是 想遍历文件
最后我想说的是 他们说的都没找到本质问题上去
把这句话
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
改为 下面2句
CString str = finder.GetFilePath();
pFile = (LPSTR)(LPCTSTR) str;
你的程序就没问题了
下面看偶的分析
第一
char* pFile;
TCHAR* p;
你让 p = pFile ; 居然没出问题 说明 你的char 和 TCHAR 是一样的玩意 你多半用的是VC6开发
要么就是自己设置了工程属性为 多字节的, 所以根本不存在什么 字符集的转换
什么 UNICODE ANSI 多字节都是瞎扯
第二
断点tiao'shi
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
执行后 pFile 指向的是乱码 所以你再往后运行肯定就会出错了
仔细看一下 finder.GetFilePath() 返回的是一个CString;
莫非楼主的 从CString 转换 为 char * 的方式错误了?
测试
CString str("123");
pFile = (LPSTR)(LPCTSTR) str;
完全没有问题啊...
所以问题 归根到底 在与 返回值是 CString 会导致很多 bug的哦
这如果要说起来就太多了... 楼主再找度娘吧
//-- 下面的写法稍微规范点 我就不懂 你定义 TCHAR 为了什么
int main()
{
CFileFind finder;
CString path("D:\\1\\Cache\\");
CString file;
BOOL has = finder.FindFile(path+"*.*");
while(has)
{
has = finder.FindNextFile();
//IsDots 就是的 . 和 .. 如果你不判断是文件夹 它会把当成文件去删除,结果去删除不掉
//在Windows系统下 文件和文件夹被看作同样的东西
if( !finder.IsDots() !finder.IsDirectory() )
{
file= finder.GetFilePath();
//CFile::Remove(file); 你这函数都没有返回值 你好意思直接就在下面显示删除成功
if (DeleteFile(file))
{
coutfile" 删除成功"endl;
}
else
{
coutfile" 删除失败, 非共享的文件是否正在使用?"endl;
}
}
}
finder.Close(); //----
return 0;
}
有CString数据的类的复制构造函数应该怎么写
是指 MFC 中的 CString 吗?
VC6.0中是比较简单的,在VS.net平台后就用模板类完全改写了CString.
以下是VC6.0中CString的拷贝构造函数,很遗憾告诉你,这里CString使用了引用计数原理,拷贝构造其实是增加引用计数,并不是深拷贝.
CString::CString(const CString stringSrc)
{
ASSERT(stringSrc.GetData()-nRefs != 0);
if (stringSrc.GetData()-nRefs = 0)
{
ASSERT(stringSrc.GetData() != _afxDataNil);
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(GetData()-nRefs);
}
else
{
Init();
*this = stringSrc.m_pchData;
}
}
我们可以再看看CString重载的赋值运算符 " = "
const CString CString::operator=(const CString stringSrc)
{
if (m_pchData != stringSrc.m_pchData)
{
if ((GetData()-nRefs 0 GetData() != _afxDataNil) ||
stringSrc.GetData()-nRefs 0)
{
// actual copy necessary since one of the strings is locked
AssignCopy(stringSrc.GetData()-nDataLength, stringSrc.m_pchData);
}
else
{
// can just copy references around
Release();
ASSERT(stringSrc.GetData() != _afxDataNil);
m_pchData = stringSrc.m_pchData;
InterlockedIncrement(GetData()-nRefs);
}
}
return *this;
}
这个有条件限制,如果nRefs 0,将执行深拷贝,否则也是增加引用计数.
nRefs 0,代表缓冲区被锁定.
详细请参考VC6.0安装目录中的源码, CString的源码分布在 strcore.cpp 和 afx.inl中.
VS.net平台中,CString 是 ATL::CStringT模板类定义成的多种类型的字符串类,详细情况也可以参考源代码,在afxstr.h中.
靠你自己了啊!! #include iostream #include cstring using namespace std; struct stringy { char *str; int ct; }; void set(stringy s
e = (LPSTR)(LPCTSTR) str;完全没有问题啊... 所以问题 归根到底 在与 返回值是 CString 会导致很多 bug的哦 这如果要说起来就太多了... 楼主再找度娘吧/
N;LPSTR pStr = (LPSTR)text.GetBuffer();LPTSTR ptStr = A2T(pStr);text.ReleaseBuffer(