我有一个文件,我需要存储在二维数组中,所以我可以对它执行矩阵运算。我所知道的是,双打将用空格和换行符分隔,例如:
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)。
我目前正在将文件加载到内存中两次以计算行数。
有没有更合理的方法将这些数据输入2D数组?我需要确保输入矩阵是正方形的,并且我的程序可以处理任何顺序的方阵。我对C很陌生,因此非常感谢示例和命名功能:)(对于狡猾的缩进道歉)
**抱歉这么模糊,我想要一些错误处理,即确保输入不被接受,除非确实有nxn双打。
答案 0 :(得分:4)
以下是您修改的代码:
/* 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);
将指针重置为文件的开头。
答案 1 :(得分:0)
fgets
n
n * n
n - 1
个n
行的{{1}}行瞧!