Xcode 編譯C++程式,freopen 讀取檔案時檔案路徑問題
在除錯程式時,有時候會有許多的輸入,如果每次Debug都自己輸入測試樣例的話會非常麻煩。
所以將輸入重定向到指定檔案,從檔案讀取輸入就方便多了。
在C++中,可以呼叫freopen這個函式來實現此功能,此函式包含在標頭檔案<iostream>中,也方便呼叫。
freopen的宣告為:
將現有檔案流stream重新分配到不有filename確定的,以模式mode使用的檔案。
FILE * freopen ( const char * filename, const char * mode, FILE * stream );
filename: 檔案路徑
mode:讀取模式-- 只讀:r, 只寫:w
stream:將這個流重定向。
簡單舉例:freopen("Input.txt", "r", stdin); 將標準輸入stdin重新分配到檔案 Input.txt,模式為只讀。
更多細節請參考:http://www.cplusplus.com/reference/cstdio/freopen/?kw=freopen
函式介紹到此,在Xcode中使用時,我碰到了一個問題,無法讀取檔案!!!
嘗試1:在工程檔案所在位置建立檔案InputFromFile.txt
函式呼叫
freopen("InputFromFile.txt", "r", stdin);
結果無法成功讀取到檔案內容。初步判定是檔案路徑不對。
嘗試2:將檔案路徑改為絕對路徑
freopen("Users/name/Code/Cpp/cppTest/cppTest/InputFromFile.txt", "r", stdin);
仍然無法成功讀取到檔案內容。
嘗試3:將檔案放到與cppTest執行檔案同一目錄下。
看到上圖中 Products/cppTest 這個執行檔案了沒?右鍵它
Show in Finder
這時你發現可執行檔案和原始碼並不在同一個資料夾,我們將輸入檔案拷貝至這個資料夾下。
函式呼叫為:
freopen("InputFromFile.txt", "r", stdin);
這時就可以成功的讀取檔案啦。
如果在Xcode下還有更方便的方法,麻煩您留言評論,十分感謝
事例程式:
首先讀入二維陣列的行數m,列數n。然後依次輸入每一個數。
#include <iostream>
#include <vector>
using namespace std;
int main(){
int m, n;
freopen("InputFromFile.txt", "r", stdin);
cin >> m >> n;
cout << "m = " << m << " n = " << n << endl;
vector<vector<int> > vec;
for(int i = 0; i < m; ++i){
vector<int> tmpvec;
for(int j = 0; j < n; ++j){
int tmp;
cin >> tmp;
tmpvec.push_back(tmp);
cout << tmp << " " ;
}
vec.push_back(tmpvec);
cout << endl;
}
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
cout << vec[i][j] << " ";
}
cout << endl;
}
return 0;
}
InputFromFile.txt
2 3
1 2 3
6 4 5
output:
m = 2 n = 3
1 2 3
6 4 5
1 2 3
6 4 5
Program ended with exit code: 0