计算写入文件的矩阵中的元素总数

时间:2018-12-07 15:14:40

标签: c file matrix

我有一个带有整数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

1 个答案:

答案 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));