2011-11-23 203 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 - 1线n值的每个
  • 计算逆

瞧!

相关问题