练习题:

#include <iostream>
#include <cstring>
using namespace std;
class mystring
{
char* p;
int len;
public:
mystring();
mystring(const char* p);
~mystring();
void copy(const mystring& str);
void append(const mystring& str);
void show();
bool compare(const mystring& str);
void swap(mystring& str);
};
mystring::mystring()
:p(NULL),len(0)
{
}
mystring::mystring(const char* p)
{
len = strlen(p);
this->p = new char[len];
strcpy(this->p,p);
}
mystring::~mystring()
{
if(p != NULL)
{
delete[] p;
}
}
void mystring::copy(const mystring& str)
{
if(p != NULL)
{
delete[] p;
}
len = strlen(str.p);
p = new char[len];
strcpy(p,str.p);
}
void mystring::append(const mystring& str)
{
len = len + str.len;
char* temp = p;
p = new char[len];
strcpy(p,temp);
strcat(p,str.p);
delete[] temp;
}
void mystring::show()
{
cout<< p << endl;
}
bool mystring::compare(const mystring& str)
{
return strcmp(p,str.p) == 0;
}
void mystring::swap(mystring& str)
{
char* temp = p;
p = str.p;
str.p = temp;
}
int main()
{
mystring str = "hello";
mystring ptr;
ptr.copy(str);
ptr.show();
ptr.append(str);
ptr.show();
if(ptr.compare(str) == true)
{
cout <<"一样"<<endl;
}
else
{
cout <<"不一样"<<endl;
}
ptr.swap(str);
ptr.show();
str.show();
return 0;
}
第一题

#include <iostream>
#include <cstring>
using namespace std;
class myFile
{
private:
FILE* fp;
public:
myFile(const char* file);
~myFile();
void mywrite(string str);
string myread(int size);
};
myFile::myFile(const char* file)
{
//fp = fopen(file,"a+");
fp = fopen(file,"w+");
if(fp == NULL)
{
cout << "文件不存在" <<endl;
return;
}
}
myFile::~myFile()
{
fclose(fp);
}
void myFile::mywrite(const string str)
{
const char* p = str.data();
printf("%s\n",p);
if(fwrite(p,strlen(p),1,fp)==0)
{
cout << "写入失败" << endl;
}
}
string myFile::myread(int size)
{
char buf[size+1] = "";
fseek(fp,0,SEEK_SET);
if(fread(buf,size,1,fp) == 0)
{
cout << "读取失败"<<endl;
}
// printf("%s\n",buf);
string p = buf;
return p;
}
int main()
{
myFile txt = "./File.txt";
txt.mywrite("1234567123455");
string buf = txt.myread(10);
cout << buf <<endl;
return 0;
}
第二题

#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;
enum kinds_mutex
{
MUTEX_FAST,
MUTEX_CHECK,
MUTEX_RECURSION
};
class Mutex
{
private:
pthread_mutex_t mu;
enum kinds_mutex kinds;
public:
Mutex();
void setMutex(enum kinds_mutex kinds);
~Mutex();
void lock();
void unlock();
};
Mutex::Mutex()
{
pthread_mutex_init(&mu,NULL);
}
void Mutex::setMutex(enum kinds_mutex kinds)
{
switch(kinds)
{
case MUTEX_FAST:
{
pthread_mutex_init(&mu,NULL);
break;
}
case MUTEX_CHECK:
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init(&mu,&attr);
break;
}
case MUTEX_RECURSION:
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_RECURSIVE_NP);
pthread_mutex_init(&mu,&attr);
break;
}
}
}
Mutex::~Mutex()
{
pthread_mutex_destroy(&mu);
}
void Mutex::lock()
{
pthread_mutex_lock(&mu);
}
void Mutex::unlock()
{
pthread_mutex_unlock(&mu);
}
Mutex m1,m2;
void* pthread_main(void* arg)
{
while(1)
{
m2.lock();
cout << "线程2"<<endl;
sleep(1);
m1.unlock();
}
}
int main()
{
pthread_t id;
m1.setMutex(MUTEX_FAST);
m2.setMutex(MUTEX_FAST);
m2.lock();
pthread_create(&id,0,pthread_main,NULL);
pthread_detach(id);
while(1)
{
m1.lock();
cout<<"线程1"<<endl;
sleep(1);
m2.unlock();
}
return 0;
}