2015-06-19 2 views
2

яЧтение файла матрицы в C

«Debug утверждение не удалось»

ошибку, когда я пытаюсь скомпилировать этот код.

Может кто-нибудь объяснить, что с ним не так? Я думаю, что я сделал что-то не так с функцией fscanf. Спасибо.

#include<stdio.h> 
#include<stdlib.h> 
#include<malloc.h> 
void input(FILE *fp, int **a,int m) 
{ 
    int i,j; 
    for(i=0;i<m;i++) 
    { 
     for(j=0;j<m;j++) 
     { 
      fscanf(fp, "%d\n", *(a+i)+j); 
     } 
    } 
} 

int main() 
{ 
    FILE*fp; 
    int m,n,**a,i,j; 
    scanf("%d",&m); 
    fp=fopen("abc.txt","r"); 
    a=(int**)malloc(m*sizeof(int*)); 
    for(i=0;i<m;i++) 
     *(a+i)=(int*)malloc(m*sizeof(int)); 
    input(fp,a,m); 
    for(i=0;i<m;i++) 
    { 
     for(j=0;j<m;j++) 
     { 
      printf("%d ",*((a+i)+j)); 
     } 
     printf("\n"); 
    } 
    free(a); 
    return 0; 
} 
+0

'* ((a + i) + j)' не делает то, что, по вашему мнению, делает. Вы хотите '* (* (a + i) + j)'. – John

+0

'* ((a + i) + j)' неверно. а также нужно 'free' each' * (a + i) ' – BLUEPIXY

+0

Как выглядит ваш abc.txt? – Elyasin

ответ

1

Есть несколько вопросов здесь, но непосредственно ответить на ваш вопрос, вы не предоставляете адрес в fscanf(), где она будет хранить целое число он находит.

Не зная ваши намерения, я приведу пример:

fscanf(fp, "%d\n", &(a[i])); 

Это говорит ith элемент массива a является один, чтобы быть (более) написано. Поэтому, если a[i] является указателем на int, вы можете пройти & ((a [i]) [j]).

Кроме того, я думаю, что вы имели в виду заменить:

*(a+i)=(int*)malloc(m*sizeof(int)); 

с

a[i] = (int*) malloc(m*sizeof(int)); 
+1

Я думаю, что [i] уже является адресом. Не уверен, что это правильно. Могли бы вы объяснить? – Elyasin

+1

Но значение, переданное функции, равно 'int ** a', поэтому' & a [i] [j] 'должно быть ОК и может быть записано как' * (a + i) + j' (или, если вы Предположим, что '& (* (* (a + i) + j))', где скобки не все необходимы). –

+0

Я думаю, что выделение в качестве 2-мерного массива в первую очередь было бы более понятным и более удобным для обработки в коде. – donjuedo

1

Другие комментарии и ответы уже отметил, что не в порядке. Поэтому я пропускаю его (fscanf(...), free и т. Д.).

Исправленная версия.

#include<stdio.h> 
#include<stdlib.h> 
#include<malloc.h> 

void input(FILE *fp, int **a, int m) { 
    int i, j; 
    for (i = 0; i < m; i++) { 
     for (j = 0; j < m; j++) { 
      fscanf(fp, "%d\n", &a[i][j]); 
     } 
    } 
} 

int main() { 
    FILE *fp; 
    int m, n, **a, i, j; 
    scanf("%d", &m); 
    fp = fopen("abc.txt", "r"); 
    a = (int**) malloc(m * sizeof (int*)); 
    for (i = 0; i < m; i++) 
     a[i] = (int*) malloc(m * sizeof (int)); 
    input(fp, a, m); 
    for (i = 0; i < m; i++) { 
     for (j = 0; j < m; j++) { 
      printf("%d ", a[i][j]); 
     } 
     printf("\n"); 
    } 
    for (i = 0; i < m; i++) 
     free(a[i]); 
    free(a); 
    return 0; 
} 
+1

Помимо отсутствия 'fclose (fp)' (и проверки ошибок), этот код работает без проблем для меня. Чтение размера со стандартного ввода, а затем данные из фиксированного имени файла являются необычным интерфейсом, но так оно и есть в оригинале. –

+0

Вы на самом деле правы. Его можно было бы лучше спроектировать. Я сделал это коротко. Однако, если у вас есть структурированный подход для перечисления «лучших практик» в этой программе, не стесняйтесь редактировать эту должность и преподавать сообщество. Вы, кажется, очень компетентны в C. – Elyasin

+1

Существует несколько возможных подходов (по крайней мере). Один из них заключается в том, чтобы включить размер массива в качестве первого числа в файле и просто прочитать файл. Я бы также сделал имя файла аргументом для программы, а не жестко подключил его к программе. Это оставляет открытой вторую альтернативу, которая заключается в передаче как размера, так и имени файла в качестве аргументов: 'matrix_reader 6 file_holding_6x6_matrix' или около того. Третьей альтернативой было бы считывание числа программ до тех пор, пока оно не достигнет EOF, а затем проверьте, что он получил квадратное число значений. _ [... продолжение ...] _ –

Смежные вопросы