C++文件流 例题

发布于:2025-02-11 ⋅ 阅读:(32) ⋅ 点赞:(0)

 问题:

设计一个留言类,实现以下的功能: 
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:";
	getline(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;
}

输出:

第一次运行:


追加写


覆盖写