2011-11-23 172 views
3

我有一個需要存儲在二維數組中的文件,以便我可以對其執行矩陣運算。我所知道的是,雙打將空格和換行,e.g分開:如何將數據文件輸入到二維數組中

2.04 3.0 4.0 
5.0 6.1 7.0 
8.0 9.03 10.0 

我不知道有多少數字會有,所以我需要一個可擴展的分析功能。到目前爲止,我有:

int main(int argc, char* argv[]) 
{ 
    FILE *fp; 
    char ch; 
    fp = fopen("matrix.dat","r"); 
    if (fp == NULL) 
    { 
     puts ("Cannot open source file"); 
    } 

    /*count the number of lines*/ 
    int lines=1; 
    char c; 
    while((c = fgetc(fp)) != EOF) 
    { 
     if(c == '\n') 
      lines++; 
    } 
    printf("lines= %i\n",lines); 

    /*reopen the file to reset the pointer*/ 
    fclose(fp); 
    fp = fopen("matrix.dat","r"); 
    double m[lines][lines]; 

    /*Load file into array*/ 
    int i,j; 
    for(i=0;i<lines;i++) 
    { 
     for(j=0;j<lines;j++) 
     { 
      fscanf(fp, "%lf", &(m[i][j])); 
     } 
     fscanf(fp, "\n", NULL); 
    } 

    /*print out stored matrix*/ 
    for(i=0;i<lines;i++) 
    { 
     for(j=0;j<lines;j++) 
     { 
      printf("%lf ",m[i][j]); 
     } 
     printf("\n"); 
    } 
} 

我用這種方法的問題是

  1. 這使得該行的數量等於每行雙打,這可能不是真實的數字假定**。

  2. 文件中缺少的雙精度將導致程序將錯誤的矩陣加載到內存中(其餘值偏移1)。

  3. 我目前正在將文件加載到內存兩次以計算行數。

有沒有更合理的方法將這些數據輸入到二維數組中?我需要確保輸入矩陣是正方形的,並且我的程序可以處理任何順序的矩形矩陣。我對C很陌生,所以示例和命名函數將會非常感謝:)(對於不好的縮進的道歉)

**對不起,我想要一些錯誤處理,即確保輸入是除非有nxn雙打才能被接受。

+0

當你說你的矩陣是正方形的時,你肯定會一直收到n^2個數字?但是你不確定它們是否沿線平均分佈? –

+0

數字應該在示例中進行格式化,程序計算矩陣的逆矩陣,所以如果文件中的矩陣不是正方形,那麼程序應該退出,因爲沒有什麼可做的。數字*應該*均勻分佈,但我想確保程序不接受任何不是nxn的東西。如果一行有n-1個數字,那麼我不希望程序將缺少的數字視爲0,它應該終止。 – Chironex

回答

4

像尼古拉斯一樣,我很好奇你的意思是按點(1)...如果矩陣是正方形的,那麼行數是否總是等於每行雙打數?如果沒有,那麼我想你可以通過文件查看具有最大值的行。

這裏的修改代碼來做到這一點:

/* count the number of lines */ 
int lines = 1; 
int maxValues = 0; 
int count = 0; 
char junk; 
while((junk == fgetc(fp)) != EOF) { 
    if(junk == '\n') { 
     lines++ 
     if(maxValues <= count) { 
      maxValues = ++count; 
     } 
     count = 0; 
    } 
    else if(junk == 0x20) { 
     count++; 
    } 
} 

爲了解決點(2),也許嘗試這個修改:

/* load file into array */ 
int i, j; 
for(i = 0; i < lines; i++) { 
    j = 0; 
    do { 
     fscanf(fp, "%lf", &(m[i][j])); 
     j++; 
    } while((junk = fgetc(fp)) != '\n'); 
} 

最後的點(3),我敢肯定您可以使用rewind(fp);將指針重置爲文件的開頭。

0
  • 閱讀fgets
  • 第一線數的值,讓我們說他們是n
  • 使n * n
  • 陣列讀取n - 1n值的每個
  • 計算逆

瞧!

相關問題