2014-04-14 48 views
0

我的問題可能很瑣碎,但我不知道如何處理它。 我有一個程序,從文件中讀取矩陣,然後從文件中收集它,顯示它並在其上執行數字方法。 當我通過cin插入一些未知數(在這種情況下,它等於文件中的行數),我得到一切正確。 但是,當我嘗試從文件讀取行數,然後讀取矩陣,顯示它並執行方法 - 雖然我得到正確的行數,程序讀取矩陣,就好像它包含0. 這裏是計數行:從文件中讀取行數並在C++中使用它的函數

int countLines(ifstream &file){ 
string line; 
int l = 0; 
do{ 
getline(file, line); 
    l++; 
}while(!file.eof()); 
return l;} 

在這裏,我嘗試使用它:

string nameoffile = ""; 
nameoffile = "Matrix1.txt"; 
    ifstream file; 
    file.open(nameoffile.c_str()); 
    if (file.good()==true) 
    { 
     cout <<"The file is available<<endl; 
     n = countLines(file); 
     cout << n << endl; 
     collectMatrix(file,n); 
    } 
    else 
    { 
     return 0; 
    } 
    displayMatrix(n); 

例如,collectMatrix看起來像這樣:

void collectMatrix(ifstream &file, int n){ 
for(int i = 0; i <n; i++) 
{ 
    for(int j = 0; j <n; j++) 
    { 
     file>>A[i][j]; //matrix 
    } 
}  
for(int k=0; k<n; k++) 
{ 
    file>>b[k]; //vector of results 
}   } 

它的所有工作,只要我在代碼而不是試圖從文件中讀取cin >> n。說實話,我必須從文件中讀取它,但編程不是很好,所以我會很感激任何提示和幫助。

+0

什麼是'plik',應該不是那種善意的'文件'而不是?我沒有看到你在哪裏設置文件的文件名,甚至打開它......這段代碼看起來像一團糟。 – lpapp

回答

1

ifstream在內部跟蹤它讀取的文件有多遠。當你的countLines方法返回時,ifstream已經一直讀到文件尾部,並且當你將它傳遞給collectMatrix時,它仍然保留文件的結尾作爲它在文件中的當前位置。當你嘗試填充矩陣時,沒有什麼需要從文件中讀取,所以矩陣值沒有設置。

你有幾個選擇來解決這個問題。首先是在填充值時計算矩陣的大小。你的代碼似乎表明矩陣是方形的;如果是這樣,您可以通過查看第一行來確定矩陣的大小。另一個更簡單但效率更低的方法是隻創建第二個具有相同文件的ifstream並將其傳遞給collectMatrix。這種方法會相當緩慢,因爲您通過文件兩次。

+0

感謝您的解釋,我現在明白了;) – user3533543

相關問題