CString和string都是一个类,不同的是CString主要用于MFC或者是ATL编程中,而string则多用于Windows控制台编程中
在实际编程过程中,我们经常用到string或者是CString来保存数据,保存数据的同时,我们也希望把这些保存的数据能够使用输入输出流给输出出来,不过是我们使用Cout标准输出到屏幕,还是使用ofstream输出到文件,我们都需要输出这些对象保存的数据
在实际过程中,我们会遇到三种情况,下面结合遇到的三种情况来说明下如何将CString或者是string对象使用标准的输入输出流输出,特别注意,这里我们讨论的是输入输出流,printf不再讨论之列
1.win32控制台程序:
在Win32控制台程序中,我们如果要使用string的话,需要包含头文件:string或者是命名空间:cstring:
1
2
|
#include <string.h> #include <cstring> |
如果我们直接使用下面的方式输出string的话,在编译时会报错:
1
2
|
string sTest = "Hello World" ;
cout<<sTest<<endl; |
错误的提示可能很多,但是根本的原因是sTest是string的一个对象,而string没有对”<<“进行运算符重载,那么肯定是不能输出的 那么我们可以使用string的成员函数来输出string对象的内容:
1
2
|
string sTest = "Hello World" ;
cout<<sTest.c_str()<<endl; //使用了string的成员函数c_str();
|
因此,我们可以得出:
在WIN32控制台中,我们可以使用string的c_str()成员函数类标准输出string的数据内容
2.在MFC程序中:
在MFC中,我们很少用到Cout来输出,用的比较多的输出是文件流输出,因此我们就以文件流的输出CString对象来举例:
1
2
3
|
CString sTest = _T( "Hello World" );
ofstream OutToFile( "E:\\Users\\Admin\\Desktop\\test.txt" ,ios::app);
OutToFile<<sTest<<endl; |
上面的例子可以看出,我们可以直接对CString对象进行文件流输出, 但是如果有的MFC程序不支持的话,那么我们需要使用下面的方法来输出CString对象:
1
2
3
4
5
6
7
8
9
10
11
12
|
CString sTest = _T( "Hello World" );
ofstream OutToFile( "E:\\Users\\Admin\\Desktop\\test.txt" ,ios::app);
wchar_t * chTest = new wchar_t [sTest.GetLength()+1]; //动态申请空间
chTest = sTest.GetBuffer(0); //获取CString内容的地址
for ( int i = 0; i<sTest.GetLength();i++){
OutToFile<<( char )*(chTest+i);
} sTest.ReleaseBuffer(); //调用了GetBuffer后一定要调用ReleaseBuffer释放,否则会出现内存泄露
OutToFile.close(); |
我们使用CString的GetBuffer得到数据的地址,然后直接输出就可以了
3.ATL项目中
前面有提到过ATL项目,他不同于MFC那么方便,要想输出CString对象的话,需要是用到ATL的宏,
1
2
3
4
|
BSTR bstrContext = OLESTR( " 内容为:" ); //使用宏OLESTR对BSTR变量赋初值
CString sContext ; sContext = COLE2T(bstrContext); //使用COLE2T将BSTR转换为CString
Cout<<(CT2A)sContext //使用CT2A宏来输出sContext的内容
|
从上面的示例代码我们了可以知道:
在ATL项目中,可以使用CT2A宏来输出CString对象