void read_matrices(int ** A,int ** B,int ** C,int * m,int * n,int * p,char *文件)
我想从如下所示的外部文件中读取两个矩阵:
3
2
4
1 2
3 4
5 6
7 8 9 10
11 12 13 14
其中第一行是矩阵A的行数,数字2是矩阵A的列数,矩阵B的行数,第三行是矩阵B的列数。尝试此操作以获取m,n和p,但出现段错误
FILE * fp = fopen(file, "r");
char a, b, d;
char c = getc(fp);
int i = 0;
while (c != EOF) {
if (i == 0) {
a = c;
i++;
}
else if (i == 1) {
b = c;
i++;
}
else if (i == 2) {
d = c;
i++;
}
else
break;
}
fclose(fp);
很明显,您需要一些帮助。这是一个仅举一反三的例子。注意:B
与其将读取可变数量的元素的示例复杂化,还不4
如将其编码为读取数据文件中存在的元素,而是对其进行简单编码。另外,fscanf
由于每个行中都有可变的数字和不同的数据要读取,因此还用于从文件中读取数据。与逐字符读取文件相比,这简化了代码,因为读取的信息类型为int
。通读示例(内联注释),如果您有任何问题,请告诉我:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv) {
int *A, *B, *C, m, n, p; /* note *C is unused */
char *file;
/* test for required filename */
if (argc < 2) {
fprintf (stderr, "\n Error: insufficient input. usage: %s filename\n\n", argv[0]);
return 1;
}
/* assign filename, open file, validate opening */
file = argv[1]; /* you don't need 'file', you can simply use argv[1] */
FILE *fp = fopen (file, "r");
if (!fp) {
fprintf (stderr, "\n Error: file open failed for file '%s'\n\n", argv[0]);
return 1;
}
/* read & output m, n, p */
fscanf (fp, "%d\n%d\n%d\n", &m, &n, &p);
printf ("\n m: %d\n n: %d\n p: %d\n\n", m, n, p);
/* allocate memory for A and set values to null */
A = calloc (m * 2, sizeof(int));
/* read A */
int i = 0;
for (i = 0; i < m; i++)
fscanf (fp, "%d %d\n", &A [i*2], &A[i*2 + 1]);
/* output A */
printf ("Array A\n");
for (i = 0; i < m; i++)
printf (" [ %d %d ]\n", A [i*2], A[i*2 + 1]);
/* allocate memory for B and set values null */
B = calloc (n * p, sizeof(int));
/* read B */
for (i = 0; i < n; i++)
fscanf (fp, "%d %d %d %d\n", &B [i*p], &B[i*p + 1], &B[i*p + 2], &B[i*p + 3]);
/* output B */
printf ("\nArray B\n");
for (i = 0; i < n; i++)
printf (" [ %2d %2d %2d %2d ]\n", B [i*p], B[i*p + 1], B[i*p + 2], B[i*p + 3]);
printf ("\n");
/* close FP & free allocated memory */
fclose (fp);
if (A) free (A);
if (B) free (B);
return 0;
}
输出:
$ ./bin/rmf dat/array.dat
m: 3
n: 2
p: 4
Array A
[ 1 2 ]
[ 3 4 ]
[ 5 6 ]
Array B
[ 7 8 9 10 ]
[ 11 12 13 14 ]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句