本人写的一字符流类
<P>注释很少,大家凑合着看吧.</P><P>这是头文件:StrStream.h</P>
<P>#ifndef STRSTREAM_H
#define STRSTREAM_H</P>
<P>//字符流声明
class StrStream
{
private:
char*m_Str; //存储字符串
long m_Len; //字符串长度
bool m_Empty; //字符流是否空
protected:
void Set(char*str); //设置串*
char*Get(); //返回串*
int GetLength(); //取得长度*
public:
StrStream(); //*
StrStream(StrStream &str); //*
StrStream(char *str); //*
~StrStream(); //*
public:
//实用接口
char*c_str(); //*
void Clear(); //*
void Strcpy(char*str); //拷贝一串到本对象*
void Strcat(char*str); //连接一串到本对象*</P>
<P> //格式化
void Sprintf(char*FMT,...); //格式化一字符串,并赋值给本串*
void CatSprintf(char*FMT,...); //格式化一字符串,并加到本串后面*
//插入删除
void Insert(int pos,char ch); //在指定位置后插入一字符*
void Insert(int pos,char*str); //在指定位置后插入字符串*
void Delete(int pos,int num); //删除指定位置后的指定字符数
//过滤部分
void Trim(); //过滤字符串两边的空格*
void TrimLeft(); //过滤字符串左边的空格*
void TrimRight(); //过滤字符串右边的空格*</P>
<P> //比较
bool Strcmp(char*str); //比较*
bool Strcmp(StrStream &str); //*
//转换
void ToLower(); //转换所有英文字符到小写*
void ToUpper(); //转换所有英文字符到大写*
int ToInt(); //转换成数字*
long ToLong();
double ToDouble();</P>
<P> //取得字符串信息
int Length(); //返回长度*
bool IsEmpty(); //返回状态*
//以下为运算符重载,方便使用
public:
StrStream & operator = (char *str); //*
StrStream & operator = (StrStream &str); //*</P>
<P> StrStream & operator+= (char *str); //*
StrStream & operator+= (StrStream &str); //*</P>
<P> bool operator== (char *str); //*
bool operator== (StrStream &str); //*</P>
<P> bool operator!= (char *str); //*
bool operator!= (StrStream &str); //*</P>
<P> bool operator > (char *str); //*
bool operator > (StrStream &str); //*
bool operator < (char *str); //*
bool operator < (StrStream &str); //*</P>
<P> bool operator>= (char *str); //*
bool operator>= (StrStream &str); //*
bool operator<= (char *str); //*
bool operator<= (StrStream &str); //*
};</P>
<P>#endif//STRSTREAM_H</P>
<P>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
以下是实现:StrStream.cpp</P>
<P>#include "StrStream.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <ctype.h>
#include <stdlib.h></P>
<P>StrStream::StrStream()
{
m_Empty=true;
m_Len =0;
}</P>
<P>StrStream::StrStream(char*str)
{
m_Empty=true;
Set(str);
}</P>
<P>StrStream::StrStream(StrStream &str)
{
m_Empty=true;
Set(str.c_str());
}</P>
<P>StrStream::~StrStream()
{
Clear();
}</P>
<P>void StrStream::Set(char *str)
{
int len=strlen(str);</P>
<P> //如果串不空
if(!m_Empty)
{
Clear();
}</P>
<P> //如果源串空
if(len==0)
return;</P>
<P> //拷贝串
m_Str=new char;
strcpy(m_Str,str);
m_Str=0;</P>
<P> m_Len=len;</P>
<P> m_Empty=false;
}</P>
<P>char* StrStream::Get()
{
if(m_Empty)
return NULL;
return m_Str;
}</P>
<P>void StrStream::Clear()
{
if(m_Empty)
return ;
delete[] m_Str;
m_Len=0;
m_Empty=true;
}</P>
<P>char*StrStream::c_str()
{
return Get();
}</P>
<P>int StrStream::GetLength()
{
if(m_Empty)
return 0;</P>
<P> return m_Len;
}</P>
<P>int StrStream::Length()
{
return GetLength();
}</P>
<P>bool StrStream::IsEmpty()
{
if(m_Empty)
return true;
return false;
}</P>
<P>void StrStream::Strcpy(char*str)
{
Set(str);
}</P>
<P>void StrStream::Strcat(char*str)
{
if(m_Empty)
{
Set(str);
}
else
{
char *ch;
int len=strlen(str)+GetLength();
ch=new char;</P>
<P> strcpy(ch,Get());
ch=0;</P>
<P> strcat(ch,str);
ch=0;</P>
<P> Set(ch);
}
}</P>
<P>bool StrStream::Strcmp(StrStream &str)
{
//如果两个串的状态相同
if(m_Empty==str.m_Empty)
{
//若都为空串,则相等
if(m_Empty)
return true;
//若不为空串,则
int len=str.Length();</P>
<P> //不相等
if(strcmp(Get(),str.c_str())!=0)
return false;
//相等
return true;
}</P>
<P> //不相等的情况
return false;
}</P>
<P>bool StrStream::Strcmp(char* str)
{
int len=strlen(str);</P>
<P> //如果源串和本串都为空,相等
if(len==0 && m_Empty)
{
return true;
}
if(strcmp(Get(),str)!=0)
return false;
return true;
}</P>
<P>void StrStream::Sprintf(char *FMT,...)
{
char str;</P>
<P> va_list va;
va_start(va,FMT);
vsprintf(str,FMT,va);
va_end(va);</P>
<P> Set(str);
}</P>
<P>void StrStream::CatSprintf(char*FMT,...)
{
char str;</P>
<P> va_list va;
va_start(va,FMT);
vsprintf(str,FMT,va);
va_end(va);</P>
<P> Strcat(str);
}</P>
<P>StrStream & StrStream::operator = (char *str)
{
Set(str);</P>
<P> return (*this);
}</P>
<P>StrStream & StrStream::operator = (StrStream &str)
{
Set(str.c_str());</P>
<P> return (*this);
}</P>
<P>StrStream & StrStream::operator +=(char *str)
{
Strcat(str);</P>
<P> return (*this);
}</P>
<P>StrStream & StrStream::operator +=(StrStream &str)
{
Strcat(str.c_str());
return (*this);
}</P>
<P>bool StrStream::operator ==(char *str)
{
int len=strlen(str);
if(m_Empty)
{
if(len==0)
return true;
return false;
}</P>
<P> if(strcmp(Get(),str)!=0)
return false;
return true;
}</P>
<P>bool StrStream::operator ==(StrStream &str)
{
if(m_Empty!=str.m_Empty)
return false;</P>
<P> if(m_Empty)
return true;</P>
<P> if(strcmp(Get(),str.c_str())!=0)
return false;
return true;
}</P>
<P>bool StrStream::operator !=(char *str)
{
int len=strlen(str);</P>
<P> if(m_Empty)
{
if(len==0)
return false;</P>
<P> return true;
}
if(strcmp(Get(),str)!=0)
return true;
return false;
}</P>
<P>bool StrStream::operator !=(StrStream &str)
{
if(m_Empty!=str.m_Empty)
return true;</P>
<P> if(m_Empty)
return false;</P>
<P> if(strcmp(Get(),str.c_str())!=0)
return false;</P>
<P> return true;
}</P>
<P>bool StrStream::operator < (char *str)
{
if(strcmp(Get(),str)<0)
return true;</P>
<P> return false;
}</P>
<P>bool StrStream::operator < (StrStream &str)
{
if(strcmp(Get(),str.c_str())<0)
return true;</P>
<P> return false;
}</P>
<P>bool StrStream::operator > (char *str)
{
if(strcmp(Get(),str)>0)
return true;
return false;
}</P>
<P>bool StrStream::operator > (StrStream &str)
{
if(strcmp(Get(),str.c_str())>0)
return true;
return false;
}</P>
<P>bool StrStream::operator <=(char *str)
{
if(strcmp(Get(),str)>0)
return false;</P>
<P> return true;
}</P>
<P>bool StrStream::operator <=(StrStream &str)
{
if(strcmp(Get(),str.c_str())>0)
return false;</P>
<P> return true;
}</P>
<P>
bool StrStream::operator >=(char *str)
{
if(strcmp(Get(),str)<0)
return false;</P>
<P> return true;
}</P>
<P>bool StrStream::operator >=(StrStream &str)
{
if(strcmp(Get(),str.c_str())<0)
return false;</P>
<P> return true;
}</P>
<P>void StrStream::ToLower()
{
if(m_Empty)
return ;</P>
<P> char* p=Get();
int s=0;
while(*p)
{
if( (*p) >= 'A' && (*p) <= 'Z')
{
m_Str=tolower(*p);
}
s++;
p++;
}
}</P>
<P>
void StrStream::ToUpper()
{
if(m_Empty)
return ;</P>
<P> char *p=Get();
int s=0;</P>
<P> while(*p)
{
if( (*p) >= 'a' && (*p) <= 'z')
{
m_Str=toupper(*p);
}</P>
<P> s++;
p++;
}
}</P>
<P>void StrStream::Insert(int pos,char ch)
{
if(m_Empty)
return ;</P>
<P> if(pos<0)
return;
if(pos==0)
pos=1;
if(pos>GetLength())
return;</P>
<P> char str1;
char str2;</P>
<P> //取得Pos处及Pos之前的字符串
strncpy(str1,Get(),pos+1);
str1=0;
strcpy(str2,Get()+pos);
//加入ch
char ch2;
ch2=ch;
ch2=0;</P>
<P> strcat(str1,ch2);
strcat(str1,str2);
Set(str1);
}</P>
<P>void StrStream::Insert(int pos,char*str)
{
if(m_Empty)
return ;</P>
<P> if(pos<0)
return;
if(pos==0)
pos=1;
if(pos>GetLength())
return;</P>
<P> int len=strlen(str);
if(len<=0)
return;</P>
<P> char str1;
char str2;</P>
<P> //取得Pos处及Pos之前的字符串
strncpy(str1,Get(),pos+1);
str1=0;
strcpy(str2,Get()+pos);</P>
<P> strcat(str1,str);
strcat(str1,str2);
Set(str1);
}</P>
<P>void StrStream::Delete(int pos,int num)
{
if(m_Empty)
return;</P>
<P> if(pos<0)
return;</P>
<P> if(pos>GetLength())
return;</P>
<P> if((num+pos)>GetLength())
return;</P>
<P> if(num<0)
return;</P>
<P> char str1;
char str2;</P>
<P> strncpy(str1,Get(),pos+1);
str1=0;</P>
<P> strncpy(str2,Get()+pos+num,GetLength()-num);
str2=0;</P>
<P> strcat(str1,str2);</P>
<P> Set(str1);
}</P>
<P>void StrStream::Trim()
{
TrimLeft();
TrimRight();
}</P>
<P>void StrStream::TrimLeft()
{
if(m_Empty)
return;</P>
<P> char *p=Get();</P>
<P>
for(long i=0;i<m_Len;i++)
{
if(*p==' ')
{
p++;
}
else
{
break;
}
}</P>
<P> char str;
strcpy(str,p);</P>
<P> Set(str);
}</P>
<P>void StrStream::TrimRight()
{
if(m_Empty)
return;</P>
<P> char *p=Get()+GetLength()-1;</P>
<P> int len=0;</P>
<P> for(long i=m_Len;i>0;i--)
{
if((*p)==' ')
{
len++;
p--;
}
else
{
break;
}
}</P>
<P> char str;
strncpy(str,Get(),GetLength()-len+1);
str=0;</P>
<P> Set(str);
}</P>
<P>int StrStream::ToInt()
{
return atoi(Get());
}</P>
<P>long StrStream::ToLong()
{
return atol(Get());
}</P>
<P>double StrStream::ToDouble()
{
return atof(Get());
}</P>
<P>
</P>
<P>
</P>
[此贴子已经被作者于2004-11-15 15:33:34编辑过] <P>大家还是看源文件吧.这上面的代码贴的不是太整齐:我把源文件传上来吧!</P> <P>写字符流时的测试程序:</P><P>StrStream str;
str="你好,我是第一句话!";
cout<<str.c_str()<<endl;
cout<<"我现在的长度:"<<str.Length()<<endl;
cout<<"相加:"<<endl;
str+="25";
cout<<"+\"25\"后:\n"<<str.c_str()<<endl;
cout<<"你与\"我是谁\"相等吗?"<<(str=="我是谁" ? "相等" : "不相等")<<endl;
cout<<"你与你自己相等吗?"<<((str==str) ? "相等" : "不相等")<<endl;
cout<<"你与\"你好\"比,谁大啊?"<<((str>"你好") ? "我大" : "你坏大")<<endl;
str.CatSprintf("%02d",3);
cout<<str.c_str()<<endl;
str="AbCDEFdddd转换测试.";
cout<<str.c_str()<<endl;
str.ToLower();
cout<<str.c_str()<<endl;
str.ToUpper();
cout<<str.c_str()<<endl;
str.Insert(0,'*');
cout<<str.c_str()<<endl;
str.Insert(5,"中国人");
cout<<str.Length()<<endl;
str.Insert(26,"8");
cout<<str.c_str()<<endl;</P><P> cout<<str.Length()<<endl;
str.Delete(2,13);
cout<<str.c_str()<<endl;</P><P> str+=" ";
cout<<str.c_str()<<1<<endl;
str.TrimRight();
cout<<str.c_str()<<2<<endl;</P><P> str=" 我是中国人,不吃外国饭!";
cout<<str.c_str()<<3<<endl;
str.TrimLeft();
cout<<str.c_str()<<4<<endl;</P><P> str=" 我是中国人,不吃鬼子饭,鬼子给我滚蛋 ";
cout<<str.c_str()<<5<<endl;
str.Trim();
cout<<str.c_str()<<6<<endl;
str.Strcat("9722");
cout<<str.c_str()<<endl;</P><P> str="97";
cout<<str.ToInt()<<endl;
str="19.874";
cout<<str.ToDouble()<<endl;</P>
页:
[1]