2014-04-07 5 views
0

리디렉션 된 파일에서 행렬을 읽는 행렬 판독기를 읽는 코드를 작성하려고합니다 (FILE 함수는 내 프로그램에서 사용되지 않습니다). 동적으로 작성된 배열 콘솔로 출력하십시오.C 매트릭스를 동적 배열로 읽는 중

중요 배열

. 전체 파일을 읽고 행의 # & 열을 계산하여 동적 (크기가 얻을 수 있다는 의미이다 나는이 두 작업을 수행하는 코드 2 개 가지 방법을 쓰기 시도 잘못된 출력 결과 :

버전 A :

while(ch != EOF) { 
    ch = fgetc(stdin); 

    if(ch == ' ') { 
    fields++; 
    } 
    if(ch == '\n') { 
    rows++; 
    } 

} 

버전 B :

do { 
    c=getchar(); 

    if(c == ' '){ 
    fields++; 
    } 

} while (c != EOF); 

질문이 파일의 LINE, 또는 말의 끝을 명중하지 않는 동안

  1. while(ch != EOF) 또는 while(c=getchar() != EOF) 의미합니까?

나는 위에 표시된 버전 B와 거의 관계가 없었습니다. 테스트 파일에 사용했을 때

10 20 30 40 
50 60 70 80 
90 10 20 30 
40 50 60 70 

나는 출력을 얻을 :

50 60 70 80 
90 10 20 30 
40 50 60 70 
70 70 70 70 

내가 여기 데 문제가 명중 한 번 내 파일을 읽고 있습니다 때마다 EOF는 루프에서 휴식 것을 생각 , 그리고 나서 파일의 두 번째 줄에 있습니다. 따라서 두 번째 줄에서 출력이 시작되고 마지막 행 번호를 X 번 복사하여 나머지 행을 채 웁니다.

내 목표는 현재 방법으로 달성 할 수 있습니까? 여기 내 코드가 모두 있습니다. 감사합니다.

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

int main() { 
    int rows=0; 
    int fields=1; 
    int i=0; 
    int j=0; 
    int c=0; 
    char ch = '\0'; 

/* while(ch != EOF) { 
    ch = fgetc(stdin); 
    if(ch == ' ') { 
     fields++; 
    } 
    if(ch == '\n') { 
     rows++; 
    } 
    } */ 

    do { 
    c=getchar(); 
    if(c == ' '){ 
     fields++; 
    } 

    } while (c != 10); 


    int **array; 
    array = malloc(fields * sizeof(int *)); 

    if(array == NULL) { 
    printf("Out of memory\n"); 
    exit(1); 
    } 

    for(i = 0; i < fields; i++) { 
    array[i] = malloc(fields * sizeof(int)); 
    if(array[i] == NULL) { 
     printf("Out of memory\n"); 
     exit(1); 
    } 

    } 

    for(i = 0; i < fields; i++) { 
    for(j = 0; j < 4; j++) { 
     int k; 
     scanf("%d", &k); 
     array[i][j] = k; 
     printf("%d ", k); 
    } 
    printf("\n"); 
    } 
} 
+0

사실 '동안 (c = getchar가()! = EOF)을 ((c = getchar가())! = EOF)'괄호를 추가하면서'이어야한다. 먼저 compare를 할당하고 비교 결과를 C에 대입하면 비교가 '0'을 반환하고 루프가 깨집니다. –

+0

btw 질문을 다시 한 번 확인합니다. 문제의 조건은 표시된 코드 조각과 일치하지 않습니다. –

+0

그래, 최근에'while (c! = EOF)'를'while (c! = 10)'으로 바 꾸었습니다. 그러나 나는 기술적으로 똑같은 일을한다고 생각합니다. 권리? 또한, 괄호를 추가하여 결과가 모두 0 인 결과를 얻었고, 4x13 매트릭스를 출력 했으므로 여기에서 지금 무슨 일이 벌어지고 있는지 알 수 있습니까? – Blued00d

답변

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

int main(){ 
    int rows = 0; 
    int cols = 0; 
    int fields = 0; 
    int i, j, c, n, status;; 
    int **array; 
    char ch; 

    array = malloc((rows+1) * sizeof(int*));//check omit 
    array[rows] = NULL; 

    while(0<(status = scanf("%d%c", &n, &ch))){ 
     if(status>1){ 
      if(cols == fields){ 
       array[rows] = realloc(array[rows], (fields=cols+1)*sizeof(int)); 
      } 
      array[rows][cols++] = n; 
      if (ch == '\n'){ 
       array = realloc(array, (++rows+1) * sizeof(int*)); 
       array[rows] = malloc(fields*sizeof(int)); 
       cols = 0; 
      } 
     } else { 
      array[rows][cols++] = n; 
      break; 
     } 
    } 
    if(cols == 0){ 
     free(array[rows--]); 
    } 
    for(i=0;i<=rows;++i){ 
     for(j=0;j<fields;++j){ 
      printf("%d ", array[i][j]); 
     } 
     printf("\n"); 
     free(array[i]); 
    } 
    free(array); 
    return 0; 
} 
관련 문제