问题:
设计一个留言类,实现以下的功能:
1) 程序第一次运行时,建立一个 message.txt 文本文件,并把用
户输入的信息存入该文件;
2) 以后每次运行时,都先读取该文件的内容并显示给用户,然
后由用户输入新的信息,退出时将新的信息存入这个文档。
文件的内容,既可以是最新的信息,也可以包括以前所有的
信息,用户可自己选择。
代码:
#include <iostream>
#include <fstream>
#include <unistd.h>
#define MESSAGE_FILE_PATH "message.txt"
using namespace std;
int menu();
// Message
class Message{
public:
string message;
fstream message_file;
void first_run(); // 第一次运行
void run(); // 普通运行
void display(); // 读输出
};
int main(){
cout<<"*******welcome********"<<endl;
Message data;
cout<<"Please leave a message:";
cin>>data.message; // 从键盘输入数据
if(access(MESSAGE_FILE_PATH,F_OK)) data.first_run(); // 如果文件不存在
else data.run();
return 0;
}
// 读输出
void Message::display(){
message_file.open(MESSAGE_FILE_PATH,ios::in|ios::binary); // 打开文件
if(message_file.fail()){ // 打开失败
cout<<"open file failed"<<endl;
return ;
}
string line;
cout<<"************************"<<endl;
cout<<"previous message: ";
while(getline(message_file,line)) cout<<line<<endl;
message_file.close();
}
// 第一次运行
void Message::first_run(){
message_file.open(MESSAGE_FILE_PATH,ios::out|ios::binary); // 创建打开文件
if(message_file.fail()){ // 打开失败
cout<<"open file failed"<<endl;
return ;
}
message_file<<message; // 写文件
cout<<"write ok,message is \""<<message<<"\"."<<endl;
message_file.close(); // 关闭文件
}
// 正常运行
void Message::run(){
int choose = 0;
Message::display(); // 读输出
choose = menu();
if(choose == 1){ // 追加
message_file.open(MESSAGE_FILE_PATH,ios::app|ios::binary); // 追加打开文件
if(message_file.fail()){ // 打开失败
cout<<"open file failed"<<endl;
return ;
}
}
else{ // 覆盖
message_file.open(MESSAGE_FILE_PATH,ios::out|ios::binary); // 清空打开文件
if(message_file.fail()){ // 打开失败
cout<<"open file failed"<<endl;
return ;
}
}
message_file<<message; // 写文件
cout<<"write success,new message is \""<<message<<"\"."<<endl;
message_file.close(); // 关闭文件
}
// 菜单
int menu(){
int choose,flag = 0;
while(1){
cout<<"************************"<<endl;
cout<<"* 1.追加 *"<<endl;
cout<<"* 2.覆盖 *"<<endl;
cout<<"************************"<<endl;
cin>>choose;
switch(choose){
case 1:
flag = 1;
break;
case 2:
flag = 1;
break;
default:
cout<<"please choose again..."<<endl;
}
if(flag) break;
}
return choose;
}