代碼
#include <iostream>
#include <limits>
#include <cstdlib>
#include <fstream>
#include <string>
using namespace std;
void exitWhenInvalidScreen(int input) {
if (input <= 0 || input>1000) {
std::cout << "invalid screen size" << std::endl;
exit(0);
}
}
class Screen {
private:
//----補充多個數(shù)據(jù)域成員
unsigned int _width;
unsigned int _height;
// 在Screen類中獲取/釋放圖形窗口資源浦箱,是一種RAII方法
// 關(guān)于RAII吸耿,可以參見異常處理單元的材料
Screen(unsigned int width, unsigned int height) {
// 如果啟用了圖形庫,則將初始化圖形模式的函數(shù)置于此處
// initgraph(width_, height_);
_width = width;
_height = height;
};
Screen(){
}
~Screen () {
// 如果啟用了圖形庫酷窥,則將關(guān)閉圖形模式的函數(shù)置于此處
// closegraph();
delete instance;
}
public:
static Screen* instance;
//----補充 getWidth() 與 getHeight() 函數(shù)咽安,
static Screen* getInstance(unsigned int width = 640, unsigned int height = 480) {
// 單例模式
//----補充函數(shù)體
if (instance == 0) {
instance = new Screen(width, height);
}
return instance;
}
unsigned int getWidth(){
return _width;
}
unsigned int getHeight(){
return _height;
}
};
Screen* Screen::instance = 0;
//----補充Screen類的特殊數(shù)據(jù)成員初始化語句
int main() {
int width, height;
Screen* screen = 0;
string filename="screen.txt";
fstream fs;
fs.open(filename,ios::out|ios::in);
if(fs.fail()){
cout<<"open failed!"<<endl;
fs.open(filename,ios::out);
fs.close();
fs.open(filename,ios::out|ios::in);
}
fs>>width>>height;
// cout<<width<<" "<<height<<endl;
if(fs.fail()){
cout<<"reading failed!"<<endl;
cin>>width>>height;
}
fs.clear();
screen = Screen::getInstance(width, height);
screen = Screen::getInstance();
fs.seekp(ios::beg);
fs <<screen->getWidth() << " " <<screen->getHeight();
fs.clear();
fs.seekg(ios::beg);
int getwidth,getheight;
fs>>getwidth>>getheight;
cout<<getwidth<<" "<<getheight<<endl;
fs.close();
// GCC及VC編譯器在調(diào)試模式下會暫停,便于查看運行結(jié)果
#if ( defined(__DEBUG__) || defined(_DEBUG) )
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.get();
#endif
return 0;
}
說明
主函數(shù)中首先定義了string類型的文件名對象蓬推;
然后創(chuàng)建了 fstream 的對象妆棒;
隨后調(diào)用open函數(shù),使用讀寫模式打開文件沸伏。
string fn("screen.txt");
fstream fs;
fs.open(fn, ios::in | ios::out);
通過使用類似下面的代碼(fail()函數(shù))糕珊,對文件打開的狀態(tài)進行判別。
對于使用 ios::in | ios::out 模式打開的文件毅糟,如果打開失敗红选,一般來說是文件不存在(也有可能是文件是不可寫的)
如果 fail() 函數(shù)返回真值,則創(chuàng)建該文件(用ios::out模式)姆另;
然后再次使用 **ios::in | ios::out **模式打開該文件喇肋。
if (fs.fail()) {
cout << "file does not exist." << endl;
fs.open(fn, ios::out);
fs.close();
fs.open(fn, ios::in | ios::out);
}
從文件中讀入屏幕寬和高,如果讀取失敗迹辐,則清除文件操作的狀態(tài)位蝶防,然后從鍵盤讀入屏幕寬和高
fs >> width >> height;
if (fs.fail()) {
cout << "can not read from file" << endl;
cout << "Please input screen width and height:" << endl;
fs.clear();
cin >> width >> height;
}
移動文件的輸出指針到文件頭,然后將屏幕的寬和高寫入到文件中明吩。
如果寫失敗间学,則關(guān)閉文件并且返回 -1,結(jié)束程序。
fs.seekp(ios::beg);
fs << screen->getWidth() << " " << screen->getHeight() << endl;
if (fs.fail()) {
cout << "Can not write to file, exit" << endl;
fs.close();
return -1;
}
移動文件的輸入指針到文件頭菱鸥,然后從文件中讀出將屏幕的寬和高宗兼,再將其顯示到屏幕上。
最后關(guān)閉文件流氮采。
fs.seekg(ios::beg);
fs >> width >> height;
cout << width << " " << height << endl;
fs.close();