本人最近在藍橋杯調試的過程中痛感到打印結果在調試界面上,腦海裏是有點不情願的。於是想出了將輸出結果重定向到指定的文件上面。
直接上代碼:
#include<iostream>
#include<cmath>
#include<fstream>
using namespace std;
static int mcount = 0;
int x[100];
bool place(int k){//判斷放置的位置是否與前面放置的皇后的位置放生衝突
for(int i = 1;i < k;i ++)
if(x[k] == x[i] //表示前 k個皇后擺放的位置是否與要擺放的第 k個發生衝突
|| abs(k - i) == abs(x[k] - x[i]))//若要擺放的第 k個皇后與前 k個做成對角關係
return false;
return true;//若上述都沒發生則表示可以擺放在該位置
}
void quene(int n) {
ofstream Save("huang.txt");
for(int i = 1;i <= n;i ++)
x[i] = 0;
int k = 1;
while(k >= 1){
x[k] = x[k] + 1;//在下一行擺放
while(x[k] <= n && !place(k))
x[k] =x[k] + 1;//搜索下一行
if(x[k] <= n && k == n){//當遍歷完所有的皇后後則打印輸出每個皇后的位置
mcount ++;
for(int i = 1;i <= n;i ++){
Save << x[i];
if(i < n)
Save <<" ";
}
Save <<endl;
}
else if(x[k] <= n && k < n)
k = k + 1;//開始放置下一個皇后
else{
x[k] = 0;//重置第 k個皇后的位置 回溯到重新開始找第 k - 1個皇后的位置
k = k - 1;
}
}
Save.close();
}
int main(){
int n;//表示輸入的皇后數
while(cin >> n){
quene(n);
cout<<mcount<<endl;
mcount = 0;
}
return 0;
}
其中,第一步:包含頭文件#include<fstream>;
第二步:定義ofstream,即"output file stream(輸出文件流)"。這樣,它將建立一個句柄(handle),以便我們能以一個文件流的形式寫入文件。故在這裏,Save就是文件句柄,可以用其他名稱代替;
第三步:定義("huang.txt");打開爲huang.txt的文件。若存在,則被替換掉;若不存在,則程序自動爲你創建一個新的文件。
需要注意的是:
(1)ofstream是一個類。因此,ofstream Save("huang.txt");是爲了創建一個ofstream類的對象;而此括號中所傳遞的參數將會上傳給構造函數。這裏我們將建立文件的名稱作爲實參傳給了該類ofstream的構造函數。其中,也會括號裏也可以傳遞其他的參數,這裏不加敘述。
(2)我們的輸出不是用cout將其輸出到屏幕上,而是用句柄來操作。其實這是重載了"<<"運算符而實現的重定向。Save << x[i];就是講數組的值寫入文件,而這個文件句柄它關聯一個打開的流式文件。所以只需輸入句柄名,接着輸入"<<",然後寫上你想輸出的內容,如字符串、數組或其他字符等就可以實現對文件的寫入。
(3)最後將全部數據寫入完之後就需要關閉這個文件,即Save.close(),剛纔也說了Save其實就是個對象。故此時就是調用這個ofstream類裏的成員函數即可關閉;
(4)一旦你關閉文件之後,在重新打開它之前,就再不能對它進行訪問。這需要重新聲明句柄才行。
而讀取一個文件與寫入到一個文件相似:
第一步:包含頭文件#include<fstream>;
第二步:定義ifstream,即"input file stream(輸入文件流)"。這樣,它將建立一個句柄(handle),以便我們能以一個文件流的形式打開文件。故在這裏,Open就是文件句柄,可以用其他名稱代替;
第三步:定義("huang.txt");打開爲huang.txt的文件;
第四步:通過Open.get(ch)來從相應的流文件中讀出一個字符,並將其返回給變量。在這句話中get( )函數只帶一個參數——用於存儲所讀取的字符的變量。所以,調用Open.get(ch)後程序將會從Open流中讀取一個字符並存入變量ch中。
第五步:Open.close();關閉文件流;