当前位置: 首页 > news >正文

C++ day2

一、练习1

        封装一个mystring类:

        拥有私有成员: 

                char* p 

                int len 

        需要让以下代码编译通过,并实现对应功能: 

                mystring str = "hello";

                mystring ptr;

                ptr.copy(str);

                ptr.append(str);

                ptr.show();  // 输出 ptr 代表的字符串;

                ptr.compare(str);  // 比较 ptr 和 str 是否一样;

                ptr.swap(str);  // 交换 ptr 和 str 的内容;

【完整代码】如下:

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

class mystring{
private:
	char* p;
	int len;
public:
	mystring();
	mystring(const char* str);
	~mystring();
	void copy(const mystring& r);
	void append(const mystring& r);
	void show();
	bool compare(const mystring& r);
	void swap(mystring& r);
	const char* data();
};
	
mystring::mystring(){
	p = NULL;
	len = 0;
}

mystring::mystring(const char* str){
	len = strlen(str);
	p = (char*)calloc(1, len+1);
	strcpy(p, str);
}

mystring::~mystring(){
	if(p != NULL){
		free(p);
	}
}

void mystring::copy(const mystring& r){
	if(p != NULL){
		free(p);
	}
	len = r.len;
	p = (char*)calloc(1, len+1);
	strcpy(p, r.p);
}

const char* mystring::data(){
	return p;
}

void mystring::append(const mystring& r){
	len = len + r.len;
	char* backup = p;
	p = (char*)calloc(1, len+1);
	strcpy(p, backup);
	strcat(p, r.p);
	free(backup);
}

void mystring::show(){
	cout << p << endl;
}

bool mystring::compare(const mystring& r){
	return strcmp(p, r.p) == 0;	
}

void mystring::swap(mystring& r){
	char* temp = p;
	p = r.p;
	r.p = temp;
}


int main()
{
	mystring str = "hello";
	printf("str = %s\n", str.data());

	mystring ptr;

	ptr.copy("你好");
	ptr.show();

	ptr.append("C++");
	ptr.show();

	if(ptr.compare(str)){
		cout << "ptr 和 str 一样" << endl;
	}else{
		cout << "ptr 和 str 不一样" << endl;
	}
	// 交换ptr和str的内容
	ptr.swap(str);

	ptr.show();
	str.show();

	return 0;
}


二、作业1

        封装一个 File 类,用有私有成员:

                File* fp;

        实现以下功能:

                File f = "文件名";  // 要求打开该文件;

                f.write(string str);  // 要求将str数据写入文件中;

                string str = f.read(int size);  // 从文件中读取最多 size 个字节,并将读取到的数据返回;

        包含:析构函数;

【完整代码】如下:

#include <iostream>
#include <string>
#include <cstring>
#include <fcntl.h>
#include <unistd.h>

using namespace std;

class myfile {
private:
    int fd; // 文件描述符

public:
    myfile(); // 默认构造函数
    myfile(const char* filename); // 带参构造函数
    ~myfile(); // 析构函数
    void open(const char* filename); // 打开文件
    void write(const string& str); // 写入文件
    string read(int size); // 读取文件
};

// 默认构造函数
myfile::myfile() {
    fd = -1; // 初始化为无效文件描述符
}

// 带参构造函数
myfile::myfile(const char* filename) {
    fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0644); // 打开文件
    if (fd == -1) {
        cout << "文件打开失败: " << filename << endl;
    }
}

// 析构函数
myfile::~myfile() {
    if (fd != -1) {
        close(fd); // 关闭文件
    }
}

// 打开文件
void myfile::open(const char* filename) {
    if (fd != -1) {
        close(fd); // 如果文件已打开,先关闭
    }
    fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0644); // 打开文件
    if (fd == -1) {
        cout << "文件打开失败: " << filename << endl;
    }
}

// 写入文件
void myfile::write(const string& str) {
    if (fd == -1) {
        cout << "文件未打开,无法写入" << endl;
        return;
    }
    ssize_t bytesWritten = ::write(fd, str.c_str(), str.size()); // 写入字符串
    if (bytesWritten == -1) {
        cout << "写入文件失败" << endl;
    }
}

// 读取文件
string myfile::read(int size) {
    if (fd == -1) {
        cout << "文件未打开,无法读取" << endl;
        return "";
    }
    char* buffer = (char*)calloc(1, size)); // 动态分配缓冲区
    if (buffer == NULL) {
        cout << "内存分配失败" << endl;
        return "";
    }
    ssize_t bytesRead = ::read(fd, buffer, size); // 读取最多 size 个字节
    if (bytesRead == -1) {
        cout << "读取文件失败" << endl;
        free(buffer);
        return "";
    }
    string result(buffer); // 将缓冲区内容转换为字符串
    free(buffer); // 释放缓冲区
    return result;
}

int main() {
    // 测试代码
    myfile f = "./1.txt"; // 打开文件
    f.write("Hello, World!\n"); // 写入数据
    f.write("Hello, C++\n");

    string content = f.read(100); // 读取最多 100 个字节
    cout << "读取到的内容: " << content << endl;

    return 0;
}


三、练习2

#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
#include <sstream>
#include <vector>
#include <memory>
#include <pthread.h>

using namespace std;

class Mutex{
private:
    pthread_mutex_t m;
    int type;
public:
    Mutex(){}
    Mutex(int type);
    void init(int type);
    void lock();
    void lock(int sec);
    void unlock();
};

Mutex::Mutex(int type)
    :type(type)
{
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_settype(&attr,type);
    pthread_mutex_init(&m,&attr);
}


void Mutex::init(int type){
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_settype(&attr,type);
    pthread_mutex_init(&m,&attr);
}


void Mutex::lock(){
    pthread_mutex_lock(&m);
}


void Mutex::unlock(){
    pthread_mutex_unlock(&m);
}



int main(int argc,const char** argv){

}


相关文章:

  • JVM深入理解
  • 网络安全技术pat实验 网络安全 实验
  • floodfill算法系列一>衣橱整理
  • GPT-SoVITS更新V3 win整合包
  • iOS进程增加内存上限的接口
  • C#发送邮件
  • 为什么Agent会失败?2025年对AI的预测
  • 网络安全中的机器学习
  • Java 反射
  • docker 部署JAR
  • ES10中Object.fromEntries(),trimStart() ,trimend()的使用方法和使用场景例子
  • 三、linux字符驱动详解
  • 算法——位运算
  • 零基础学QT、C++(三)魔改QT组件库(付源码)
  • 第42天:Web开发-JavaEE应用Servlet技术路由配置生命周期过滤器Filter监听器Listen
  • C#```
  • Server-Sent Events(SSE)协议详解
  • 千峰React:组件使用(1)
  • 基于Spring Boot的售楼管理系统设计与实现(LW+源码+讲解)
  • Spring Cloud中如何使用Eureka:超详细指南
  • 郭少雄导演逝世,享年82岁
  • 9米长林肯车开进“皖南川藏线”致拥堵数小时,车主回应称将配合调查
  • 申活观察|人潮涌动成常态,豫园为何常来常新?
  • 融创中国清盘聆讯延至8月25日,清盘呈请要求遭到部分债权人反对
  • 马上评|启动最高层级医政调查,维护医学一方净土
  • 家政阿姨如何炼成全国劳模?做饭、收纳、养老、外语样样都会