xShandow 发表于 2004-11-15 15:28

本人写的一字符流类

<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 &amp;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 &amp;str); //*

//转换
void ToLower();     //转换所有英文字符到小写*
void ToUpper();     //转换所有英文字符到大写*
int  ToInt();     //转换成数字*
long ToLong();     
double ToDouble();</P>
<P> //取得字符串信息
int  Length();     //返回长度*
bool IsEmpty();     //返回状态*
//以下为运算符重载,方便使用
public:
StrStream &amp; operator = (char      *str);  //*
StrStream &amp; operator = (StrStream &amp;str);  //*</P>
<P> StrStream &amp; operator+= (char      *str);  //*
StrStream &amp; operator+= (StrStream &amp;str);  //*</P>
<P> bool        operator== (char      *str);  //*
bool        operator== (StrStream &amp;str);  //*</P>
<P> bool        operator!= (char      *str);  //*
bool        operator!= (StrStream &amp;str);  //*</P>
<P> bool        operator &gt; (char      *str);  //*
bool        operator &gt; (StrStream &amp;str);  //*
bool        operator &lt; (char      *str);  //*
bool        operator &lt; (StrStream &amp;str);  //*</P>
<P> bool        operator&gt;= (char      *str);  //*
bool        operator&gt;= (StrStream &amp;str);  //*
bool        operator&lt;= (char      *str);  //*
bool        operator&lt;= (StrStream &amp;str);  //*
};</P>
<P>#endif//STRSTREAM_H</P>
<P>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
以下是实现:StrStream.cpp</P>
<P>#include "StrStream.h"
#include &lt;stdio.h&gt;
#include &lt;string.h&gt;
#include &lt;stdarg.h&gt;
#include &lt;ctype.h&gt;
#include &lt;stdlib.h&gt;</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 &amp;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 &amp;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 &amp;&amp; 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 &amp; StrStream::operator = (char *str)
{
Set(str);</P>
<P> return (*this);
}</P>
<P>StrStream &amp; StrStream::operator = (StrStream &amp;str)
{
Set(str.c_str());</P>
<P> return (*this);
}</P>
<P>StrStream &amp; StrStream::operator +=(char *str)
{
Strcat(str);</P>
<P> return (*this);
}</P>
<P>StrStream &amp; StrStream::operator +=(StrStream &amp;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 &amp;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 &amp;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 &lt; (char *str)
{
if(strcmp(Get(),str)&lt;0)
  return true;</P>
<P> return false;
}</P>
<P>bool StrStream::operator &lt; (StrStream &amp;str)
{
if(strcmp(Get(),str.c_str())&lt;0)
  return true;</P>
<P> return false;
}</P>
<P>bool StrStream::operator &gt; (char *str)
{
if(strcmp(Get(),str)&gt;0)
  return true;
return false;
}</P>
<P>bool StrStream::operator &gt; (StrStream &amp;str)
{
if(strcmp(Get(),str.c_str())&gt;0)
  return true;
return false;
}</P>
<P>bool StrStream::operator &lt;=(char *str)
{
if(strcmp(Get(),str)&gt;0)
  return false;</P>
<P> return true;
}</P>
<P>bool StrStream::operator &lt;=(StrStream &amp;str)
{
if(strcmp(Get(),str.c_str())&gt;0)
  return false;</P>
<P> return true;
}</P>
<P>
bool StrStream::operator &gt;=(char *str)
{
if(strcmp(Get(),str)&lt;0)
  return false;</P>
<P> return true;
}</P>
<P>bool StrStream::operator &gt;=(StrStream &amp;str)
{
if(strcmp(Get(),str.c_str())&lt;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) &gt;= 'A' &amp;&amp; (*p) &lt;= '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) &gt;= 'a' &amp;&amp; (*p) &lt;= '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&lt;0)
  return;

if(pos==0)
  pos=1;

if(pos&gt;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&lt;0)
  return;

if(pos==0)
  pos=1;

if(pos&gt;GetLength())
  return;</P>
<P> int len=strlen(str);
if(len&lt;=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&lt;0)
  return;</P>
<P> if(pos&gt;GetLength())
  return;</P>
<P> if((num+pos)&gt;GetLength())
  return;</P>
<P> if(num&lt;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&lt;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&gt;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编辑过]

xShandow 发表于 2004-11-15 15:31

<P>大家还是看源文件吧.这上面的代码贴的不是太整齐:我把源文件传上来吧!</P>

xShandow 发表于 2004-11-15 15:47

<P>写字符流时的测试程序:</P><P>StrStream str;
str="你好,我是第一句话!";
cout&lt;&lt;str.c_str()&lt;&lt;endl;
cout&lt;&lt;"我现在的长度:"&lt;&lt;str.Length()&lt;&lt;endl;

cout&lt;&lt;"相加:"&lt;&lt;endl;
str+="25";
cout&lt;&lt;"+\"25\"后:\n"&lt;&lt;str.c_str()&lt;&lt;endl;

cout&lt;&lt;"你与\"我是谁\"相等吗?"&lt;&lt;(str=="我是谁" ? "相等" : "不相等")&lt;&lt;endl;
cout&lt;&lt;"你与你自己相等吗?"&lt;&lt;((str==str) ? "相等" : "不相等")&lt;&lt;endl;
cout&lt;&lt;"你与\"你好\"比,谁大啊?"&lt;&lt;((str&gt;"你好") ? "我大" : "你坏大")&lt;&lt;endl;

str.CatSprintf("%02d",3);
cout&lt;&lt;str.c_str()&lt;&lt;endl;

str="AbCDEFdddd转换测试.";
cout&lt;&lt;str.c_str()&lt;&lt;endl;
str.ToLower();
cout&lt;&lt;str.c_str()&lt;&lt;endl;
str.ToUpper();
cout&lt;&lt;str.c_str()&lt;&lt;endl;

str.Insert(0,'*');
cout&lt;&lt;str.c_str()&lt;&lt;endl;
str.Insert(5,"中国人");
cout&lt;&lt;str.Length()&lt;&lt;endl;
str.Insert(26,"8");
cout&lt;&lt;str.c_str()&lt;&lt;endl;</P><P> cout&lt;&lt;str.Length()&lt;&lt;endl;
str.Delete(2,13);
cout&lt;&lt;str.c_str()&lt;&lt;endl;</P><P> str+="    ";
cout&lt;&lt;str.c_str()&lt;&lt;1&lt;&lt;endl;
str.TrimRight();
cout&lt;&lt;str.c_str()&lt;&lt;2&lt;&lt;endl;</P><P> str="    我是中国人,不吃外国饭!";
cout&lt;&lt;str.c_str()&lt;&lt;3&lt;&lt;endl;
str.TrimLeft();
cout&lt;&lt;str.c_str()&lt;&lt;4&lt;&lt;endl;</P><P> str="  我是中国人,不吃鬼子饭,鬼子给我滚蛋   ";
cout&lt;&lt;str.c_str()&lt;&lt;5&lt;&lt;endl;
str.Trim();
cout&lt;&lt;str.c_str()&lt;&lt;6&lt;&lt;endl;

str.Strcat("9722");
cout&lt;&lt;str.c_str()&lt;&lt;endl;</P><P> str="97";
cout&lt;&lt;str.ToInt()&lt;&lt;endl;
str="19.874";
cout&lt;&lt;str.ToDouble()&lt;&lt;endl;</P>
页: [1]
查看完整版本: 本人写的一字符流类