实验六 模板类和文件I/O

实验任务三

#include <iostream>
#include <fstream>
#include <array>
#define N 5

int main() {
    using namespace std;

    array<int, N> x {97, 98, 99, 100, 101};

    ofstream out;
    out.open("data1.dat", ios::binary);
    if(!out.is_open()) {
        cout << "fail to open data1.dat\n";
        return 1;
    }

    out.write(reinterpret_cast<char *>(&x), sizeof(x));
    out.close();
}
#include <iostream>
#include <fstream>
#include <array>
#define N 5

int main() {
    using namespace std;
    array<int, N> x;

    ifstream in;
    in.open("data1.dat", ios::binary);
    if(!in.is_open()) {
        cout << "fail to open data1.dat\n";
        return 1;
    }

    in.read(reinterpret_cast<char *>(&x), sizeof(x));
    in.close();

    for(auto i = 0; i < N; ++i)
        cout << x[i] << ", ";
    cout << "\b\b \n";
}

当把task_2.cpp中line8的数组类型从int类型修改成char类型时,运行结果为:

 

 原因:

write函数把一块内存中的一块内容写到一个文件输出流中,写入的时候是按字节块写入的,task_1.cpp中是写入了整数类型到文件中,一共写入了5个整数,一个整数占4个字节,所以写入了20个字节的内容。而read函数同样是将一个文件读字节到一个指定的存储器区域,由长度参数确定要读的字节数。而当task_2.cpp中line8的数组类型从int类型修改成char类型时,由于一个char类型只占一个字节,长度参数为5,所以read只读了文件20个字节数中前5个字节的内容。由于所给的五个整数都小于255,所以只需要一个字节便能存储,所以用于存储每个数的四个字节其中三个无内容,因此前五个字节只有第一个和第五个有内容,因此输出如图结果。

 实验任务4

#pragma once
#include<iostream>
using namespace std;
template<typename T>
class Vector{
public:
    Vector(int size=0):size{size}{}
    Vector(int size,T value):size{size}{
        p=new T[size];
        for(int i=0;i<size;i++)p[i]=value;
    }
    Vector(const Vector<T> &v){
        size=v.size;
        p=new T[size];
        for(int i=0;i<size;i++)p[i]=v.p[i];
    }
    ~Vector(){}
    void get_size(){
        return size;
    }
    T& at(int i){
        if(i<size&&i>=0)return p[i];
    }
    T& operator[](int i){
        return p[i];
    }
    template<typename T1>
    friend void output(Vector<T1>v);
private:
    T *p;
    int size;
};
template<typename T1>
void output(Vector<T1>v){
    int i;
    for(i=0;i<v.size-1;i++)cout<<v.p[i]<<", ";
    cout<<v.p[i]<<endl;
}
#include <iostream>
#include "Vector.hpp"

void test() {
    using namespace std;

    int n;
    cin >> n;
    
    Vector<double> x1(n);
    for(auto i = 0; i < n; ++i)
        x1.at(i) = i * 0.7;

    output(x1);

    Vector<int> x2(n, 32);
    Vector<int> x3(x2);

    output(x2);
    output(x3);

    x2.at(0) = 64;
    output(x2);

    x3[0] = 99;
    output(x3);
}

int main() {
    test();
}

实验任务5

#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
void output(ostream& out){
    char c;
    out<<"  ";
    for(c='a';c<='z';c++)out<<setw(2)<<c;
    out<<endl;
    for(int i=1;i<=26;i++)
    {
        out<<setw(2)<<i;
        for(int j=0;j<26;j++)
        {
            c='A'+(i+j)%26;
            out<<setw(2)<<c;
        }
        out<<endl;
    }
}
int main()
{
    output(cout);
    ofstream out;
    out.open("cipher_key.txt");
    output(out);
    out.close();
    return 0;
}

 

posted @ 2022-12-03 18:55  小樊_1973  阅读(1)  评论(0编辑  收藏  举报