• 网易云课堂_C++程序设计入门(下)_第7单元:出入虽同趣,所向各有宜 – 文件输入和输出_第7单元


    第7单元 - 作业2:编程互评

    �返回
     

    提交作业(剩余10天)

    完成并提交作业
     
     

    作业批改

    互评训练
     
    互评作业
     
    自评作业
     
     

    成绩公布

    查看成绩
     

    由于在线编程不支持文件操作,因此,本单元的作业需要采用互评方式完成。

    在互评评分标准中,会有对题目的解析,所以,想要知道如何做题的同学,一定要参加互评

    本次作业有两道题,分别练习文本模式文件IO以及二进制文件IO

    依照学术诚信条款,我保证此回答为本人原创,所有回答中引用的外部材料已经做了出处标记。

    1
    (10分)

    题目说明请参见 本单元 【第X节:第7单元作业说明】中的 【第7单元 - 单元作业第2题说明

    请提交代码(仅 cpp 文件)。

    本作业的解析结果在互评的得分标准中。所以,想要了解如何做这道题的同学,务必进行互评

    答案内容超过5000字建议使用附件形式上传
     
    #include <fstream>
    #include <iostream>
    #include <limits>
    
    using namespace std;
    
    class Screen {
    private:
    	//----补充多个数据域成员
    
    	// 在Screen类中获取/释放图形窗口资源,是一种RAII方法
    	//   关于RAII,可以参见异常处理单元的材料
    	unsigned int width_;
    	unsigned int height_;
    	static Screen *instance;
    
    	Screen(unsigned int width, unsigned int height) {
    		// 如果启用了图形库,则将初始化图形模式的函数置于此处
    		// initgraph(width_, height_);
    		width_ = width;
    		height_ = height;
    	};
    	~Screen() {
    		// 如果启用了图形库,则将关闭图形模式的函数置于此处
    		// closegraph();
    		delete instance;
    		instance = NULL;
    	}
    
    public:
    	//----补充 getWidth() 与 getHeight() 函数,
    	unsigned int getWidth()
    	{
    		return width_;
    	}
    
    	unsigned int getHeight()
    	{
    		return height_;
    	}
    
    	static Screen* getInstance(unsigned int width = 640, unsigned int height = 480) {
    		// 单例模式
    		//----补充函数体
    		Screen* ret = instance;
    		if (ret == NULL)
    		{
    			instance = new Screen(width, height);
    			ret = instance;
    		}
    
    		return ret;
    	}
    };
    
    Screen* Screen::instance = 0;
    //----补充Screen类的特殊数据成员初始化语句
    
    int main() {
    	int width, height;
    	Screen* screen = 0;
    	//第7单元 - 单元作业第2题说明 (概要)_1. 用 string 对象保存文件名 "screen.txt";然后创建 fstream 对象,再调用open函数,使用读写模式打开文件。
    	string fileName = "screen.txt";
    
    	fstream fs;//第7单元 - 单元作业第2题说明(详细)_1. 假定文件流对象为 fstream fs;
    
    	fs.open(fileName, ios::in | ios::out);//第7单元 - 单元作业第2题说明(详细)_2. 读写模式打开文件时,需要使用  ios::in | ios::out 作为流对象fs的 open 函数的参数
    
    										  //第7单元 - 单元作业第2题说明 (概要)_2. 使用读写模式打开的文件,如果文件不存在,则会打开失败。在这种情况下需要使用单独的“写模式”打开文件然后再关闭该文件,即可创建一个长度为0的空文件。然后再以读写模式打开该文件。
    										  //第7单元 - 单元作业第2题说明(详细)_3. 判断文件操作(打开、读写)是否成功,使用 fs.fail() 判断。如果成功, fail() 返回 false,否则返回 true
    	if (fs.fail()) {
    		//输出提示信息
    		std::cout << "使用读写模式打开的文件,如果文件不存在,则会打开失败。" << std::endl;
    		//用写模式打开文件
    		fs.open(fileName, ios::out);
    		//关闭文件
    		fs.close();
    		//再次用读写模式打开文件
    		fs.open(fileName, ios::in | ios::out);
    	}
    
    	//第7单元 - 单元作业第2题说明 (概要)_3. 从打开的文件中,读取屏幕的宽和高。如果读取失败,则从键盘读入屏幕的宽和高。同时,要清除文件流的状态位,否则后面的所有文件操作代码均会失败。
    	//第7单元 - 单元作业第2题说明(详细)_4. 打开文件后,如果文件为空(大小为0),那么从文件流里面读取数据时会失败。此时需要从键盘读取屏幕的宽和高。然后,需要调用下面的函数,清除文件流的状态位,否则所有后续文件操作都会失败。
    
    	//获取文件大小
    	fs.seekg(0, ios_base::end);
    	int nFileLen = fs.tellg();
    
    	if (nFileLen == 0)
    	{
    		std::cin >> width >> height;
    		fs.clear();
    	}
    	else
    	{
    		fs.seekg(ios::beg);  //将文件的读指针移动到文件头
    		fs >> width >> height;
    	}
    
    	//第7单元 - 单元作业第2题说明 (概要)_4. 保留原 main() 函数中的代码:
    	screen = Screen::getInstance(width, height);
    	screen = Screen::getInstance();
    
    	//第7单元 - 单元作业第2题说明 (概要)_5. 在文件的头部开始,写入屏幕的宽(screen->getWidth())和屏幕的高度(screen->getHeight())
    	fs.seekp(ios::beg);  //将文件的写指针移动到文件头
    	fs << screen->getWidth() << " " << screen->getHeight();
    
    	//第7单元 - 单元作业第2题说明 (概要)_6. 如果写文件出错,则提示错误信息然后关闭文件并返回 - 1
    	if (fs.fail())
    	{
    		std::cout << "6. 如果写文件出错,则提示错误信息然后关闭文件并返回 - 1" << std::endl;
    		fs.close();
    		return -1;
    	}
    	//第7单元 - 单元作业第2题说明 (概要)_7. 从文件中读取刚刚写入的屏幕的宽和高,然后显示到屏幕上
    	fs.seekg(ios::beg);  //将文件的读指针移动到文件头
    	fs >> width >> height;
    	std::cout << width << " " << height;
    
    	//第7单元 - 单元作业第2题说明 (概要)_8. 最后关闭文件
    	fs.close();
    
    	return 0;
    }
    
  • 相关阅读:
    Java基础之:构造方法(构造器)与this关键字
    Java基础之:属性与局部变量作用域
    Java基础之:方法重载与可变参数
    Java基础之:成员方法与传参机制
    Java基础之:类与对象
    Java基础之:数组练习题
    Java基础之:二维数组
    Promise对象的简单用法
    如何用vue-cli初始化一个vue项目
    get和post请求的区别
  • 原文地址:https://www.cnblogs.com/denggelin/p/7134295.html
Copyright © 2020-2023  润新知