我有一个带有整数NxN矩阵的文件,我该如何在程序中为具有适当尺寸的矩阵分配正确的内存。
int i, j;
FILE *file_ptr;
file_ptr= fopen( "matrice.txt" , "r");
if(file_ptr==NULL) {
printf("errore nome programma");
return 1;
}
int N;
fseek(file_ptr, 0L, SEEK_END);
N = (ftell(file_ptr))/16;
fseek(file_ptr, 0, SEEK_SET);
if( N < 4){
printf("matrice di dimensioni inferiore a 4");
return 1;
}
int **file_matrix = (int**)calloc( N , sizeof(file_matrix));
for(i = 0 ; i < N ; i ++){
file_matrix[i]= (int*) calloc( N , sizeof(file_matrix));
}
for(i = 0 ; i < N ; i++){
for(j = 0 ; j < N ; j++){
if(!fscanf(file_ptr , "%d" , &file_matrix[i][j])) break;
}
我遇到的问题是,如果我编写7x7矩阵,则可以正确打印,如果我更改它,编写4x4,则可以打印更多零元素,因为我分配了calloc。 更好:如果没有if(n <4),它将输出零;使用它,程序将打印在if中写入的错误
1 0 4 0 4
2 3 4 9 4
1 3 4 5 4
0 0 1 0 4
1 2 3 4 5
答案 0 :(得分:0)
仅读取第一行即可找到N
的值:
int N = 0;
char* line = NULL;
ssize_t read, len;
if ((read = getline(&line, &len, file_ptr)) != -1) {
char *n = strtok(line, " ");
do {
N++;
} while ((n = strtok(NULL, " ")) != NULL);
free(line);
line = NULL;
}
fseek(file_ptr, 0, SEEK_SET);
由于ftell
函数仅返回文件长度(以字节为单位),因此不能使用整数形式,因为在ASCII文件中,数字之间用空格" "
隔开。
因此,在检索到第一个文件行之后,您可以使用strtok
对其进行标记,并用空格标记分隔并在其中获取整数个数:
char *n = strtok(line, " ");
do {
N++;
} while ((n = strtok(NULL, " ")) != NULL);
还请记住使用#include <string.h>
的{{1}}函数。
还要注意strtok
大小的问题:
calloc
应该是
int **file_matrix = (int**)calloc( N , sizeof(file_matrix));
file_matrix[i] = (int*) calloc( N , sizeof(file_matrix));