1. 程式人生 > >Xcode 編譯C++程式,freopen 讀取檔案時檔案路徑問題

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