文件读写类(链式内存管理

在这里插入图片描述
在这里插入图片描述

待填充模板:

#ifndef BPT_MEMORYRIVER_HPP
#define BPT_MEMORYRIVER_HPP

#include <fstream>

using std::string;
using std::fstream;
using std::ifstream;
using std::ofstream;

template<class T, int info_len = 2>
class MemoryRiver {
private:
    /* your code here */
    fstream file;
    string file_name;
    int sizeofT = sizeof(T);
public:
    MemoryRiver() = default;

    MemoryRiver(const string& file_name) : file_name(file_name) {}

    void initialise(string FN = "") {
        if (FN != "") file_name = FN;
        file.open(file_name, std::ios::out);
        int tmp = 0;
        for (int i = 0; i < info_len; ++i)
            file.write(reinterpret_cast<char *>(&tmp), sizeof(int));
        file.close();
    }

    //读出第n个int的值赋给tmp,1_base
    void get_info(int &tmp, int n) {
        if (n > info_len) return;
        /* your code here */
    }

    //将tmp写入第n个int的位置,1_base
    void write_info(int tmp, int n) {
        if (n > info_len) return;
        /* your code here */
    }

    //在文件合适位置写入类对象t,并返回写入的位置索引index
    //位置索引意味着当输入正确的位置索引index,在以下三个函数中都能顺利的找到目标对象进行操作
    //位置索引index可以取为对象写入的起始位置
    int write(T &t) {
        /* your code here */
    }

    //用t的值更新位置索引index对应的对象,保证调用的index都是由write函数产生
    void update(T &t, const int index) {
        /* your code here */
    }

    //读出位置索引index对应的T对象的值并赋值给t,保证调用的index都是由write函数产生
    void read(T &t, const int index) {
        /* your code here */
    }

    //删除位置索引index对应的对象(不涉及空间回收时,可忽略此函数),保证调用的index都是由write函数产生
    void Delete(int index) {
        /* your code here */
    }
};


#endif //BPT_MEMORYRIVER_HPP

在这里插入图片描述

AC代码:

#ifndef BPT_MEMORYRIVER_HPP
#define BPT_MEMORYRIVER_HPP

#include <fstream>
#include <iostream>

using std::string;
using std::fstream;
using std::ifstream;
using std::ofstream;

struct Node{
	int data;
	Node *next;
};

template<class T, int info_len = 2>
class MemoryRiver {
private:
    /* your code here */
    fstream file;
    string file_name;
    int sizeofT = sizeof(T);
    Node *head;
public:
    MemoryRiver() = default; 

    MemoryRiver(const string& file_name) : file_name(file_name) {}

    void initialise(string FN = "") {
        if (FN != "") file_name = FN;
        file.open(file_name, std::ios::out);
        int tmp = 0;
        for (int i = 0; i < info_len; ++i)
            file.write(reinterpret_cast<char *>(&tmp), sizeof(int));//全部置为0 
        file.close();
        head = NULL;
    }

    //读出第n个int的值赋给tmp,1_base
    void get_info(int &tmp, int n) {
        if (n > info_len) return;
        /* your code here */
        file.open(file_name, std::ios::in);
        file.seekg((n-1)*sizeof(int));
        file.read(reinterpret_cast<char *>(&tmp), sizeof(int));
        file.close();
    }
	
	//ifstream - seekg-tellg  ofstream - seekp-tellp
	
    //将tmp写入第n个int的位置,1_base
    void write_info(int tmp, int n) {
        if (n > info_len) return;
        /* your code here */
        file.open(file_name, std::ios::in | std::ios::out);
        file.seekp((n-1)*sizeof(int));
        file.write(reinterpret_cast<char *>(&tmp), sizeof(int));
        file.close();
    }

    //在文件合适位置写入类对象t,并返回写入的位置索引index
    //位置索引意味着当输入正确的位置索引index,在以下三个函数中都能顺利的找到目标对象进行操作
    //位置索引index可以取为对象写入的起始位置
    int write(T &t) {
        /* your code here */
        file.open(file_name, std::ios::in | std::ios::out);
        if(!head) {
        	file.seekp(0,std::ios::end);
		} 
        else file.seekp((head->data)*sizeofT+info_len*sizeof(int));
        int index = file.tellp();
        file.write(reinterpret_cast<char *>(&t), sizeofT);
        file.close();
        if(head) {
        	Node *tmp = head;
        	head = head->next;
        	delete tmp;
		}
        return index;
    }

    //用t的值更新位置索引index对应的对象,保证调用的index都是由write函数产生
    void update(T &t, const int index) {
        /* your code here */
        file.open(file_name, std::ios::in | std::ios::out);
        file.seekp(index);
        file.write(reinterpret_cast<char *>(&t), sizeofT);
        file.close();
        
    }

    //读出位置索引index对应的T对象的值并赋值给t,保证调用的index都是由write函数产生
    void read(T &t, const int index) {
        /* your code here */
        file.open(file_name, std::ios::in);
        file.seekg(index); 
        file.read(reinterpret_cast<char *>(&t), sizeofT);
        file.close();
    }

    //删除位置索引index对应的对象(不涉及空间回收时,可忽略此函数),保证调用的index都是由write函数产生
    void Delete(int index) {
        /* your code here */
        Node *tmp = new Node;
      	tmp->data = (index-info_len*sizeof(int))/sizeofT;
        if(!head){
        	head = tmp;
        	tmp->next = NULL;
		} 
        else {
        	tmp->next = head->next;
        	head = tmp;
		}
    }
};


#endif //BPT_MEMORYRIVER_HPP

删去的空间插入链表中,下一次写新东西可以直接覆盖,减小空间的使用量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值