题目描述
请定义一个文件File类,并派生出TextFile(文本文件)类,要求如下。
(一) 基类File类: 有成员变量filename,filesize分别表示文件名(字符串类型),文件大小(长整数类型)。
(二) 派生类TextFile类: 新增成员变量fileEncoder(文件编码方式)。常见的编码方式有四种(“ASCII”,“Unicode”,“UTF8”和“ANSI”)。可以是字符串类型char[]或者数值类型0,1,2,3分别作为“ASCII”,“UNICODE”,“UTF8”和“ANSI”的标记。
- 自行添加构造函数。
- 新增成员函数UpdateFilesize(long size),来修改文件大小。
- 新增多态函数UpdateFile()来更新文件信息。多态函数有下面两种形式:
- 仅更新文件编码方式。
UpdateFile(char[] encode, int encodeLength)
UpdateFile(int encodeFlag)
- 更新文件编码方式并更新文件名。
UpdateFile(char[] encode, int encodeLength, char[] name int nameLength)
UpdateFile(int encodeFlag, char[] name, int nameLength)
- 新增成员函数Show()来展示文件信息。展示的文件信息格式像这样“文件名 文件大小 文件编码方式”用空格隔开,如: Main.cpp 32 ASCII
输入
第一行为三个初始字段,文件名,文件大小,文件编码方式。其中文件名为字符串(长度不超过256),文件大小为整数,文件编码方式为数字0(表示ASCII编码),1(表示Unicode编码),2(表示UTF8编码)或3(表示ANSI编码)。
第二行首先输入整数n(0<n<10),表示接下来要测试n个函数,接下来每输入一个函数操作(符号表示,参看下表),便执行一个函数,执行过程中可能涉及读取下一行的数据作为参数。若输入的函数符号没有对应函数,则输出“No such function!”(全英文,有叹号无引号)。
符号 | 函数 | 说明 |
---|---|---|
S | Show | 打印信息 |
s | UpdateFilesize | 更新文件大小,需读取下一行数据作为参数 |
E | UpdateFile | 仅更新文件编码方式,需读取下一行数据作为参数 |
e | UpdateFile | 更新文件编码方式并更新文件名, 需读取下一行数据作为参数 |
输出:
对应函数的执行结果。
样例输入:
NKU_nice_every_day.txt 4321 0
7
S
s
54321
E
1
S
e
2 NKU_happy_every_day.md
n
S
样例输出:
NKU_nice_every_day.txt 4321 ASCII
NKU_nice_every_day.txt 54321 Unicode
No such function!
NKU_happy_every_day.md 54321 UTF8
#include <iostream>
#include <string>
using namespace std;
class File{
protected:
string filename; // 成员变量:文件名
long filesize; // 成员变量:文件大小
public:
// 构造函数,初始化filename和filesize成员
File(string name, long size) : filename(name), filesize(size){}
};
class TextFile : public File{ // 定义TextFile类,继承File类
private:
int fileEncoder; // 成员变量:文件编码方式标记
string encodeStr[4] = {"ASCII", "Unicode", "UTF8", "ANSI"}; // 定义常量数组,存储四种编码方式的字符串表示
public:
// 构造函数,初始化filename、filesize和fileEncoder成员
TextFile(string name, long size, int encoder) : File(name, size), fileEncoder(encoder){}
void UpdateFilesize(long size){ // 成员函数,用于修改文件大小
filesize = size;
}
void UpdateFile(int encodeFlag){ // 成员函数,用于更新文件的编码方式
fileEncoder = encodeFlag;
}
void UpdateFile(int encodeFlag, string name){ // 成员函数,用于同时修改文件的编码方式和文件名
fileEncoder = encodeFlag;
filename = name;
}
void Show(){ // 成员函数,用于展示文件信息
cout << filename << " " << filesize << " " << encodeStr[fileEncoder] << endl;
}
};
int main() {
string name;
long size;
int encode, n;
char op;
cin >> name >> size >> encode; // 读取文件名、文件大小和文件编码方式标记
TextFile f1(name, size, encode); // 创建TextFile对象f1
cin >> n; // 读取操作命令的数量
for (int i = 0; i < n; i++){ // 循环执行操作命令
cin >> op; // 读取操作命令的符号
switch (op) { // 根据符号执行相应的操作
case 'S':
f1.Show(); // 展示文件信息
break;
case 's':
cin >> size; // 读取需要修改的文件大小
f1.UpdateFilesize(size); // 更新文件大小
break;
case 'E':
cin >> encode; // 读取需要修改的文件编码方式标记
f1.UpdateFile(encode); // 更新文件编码方式
break;
case 'e':
cin >> encode >> name; // 读取需要修改的文件编码方式标记和文件名
f1.UpdateFile(encode, name); // 更新文件编码方式和文件名
break;
default:
cout << "No such function!" << endl; // 错误提示
break;
}
}
return 0;
}