2012-04-04 3 views
2

C 응용 프로그램에서 사용하기 위해 MATLAB에서 load() 함수를 복제하려고합니다. 동적으로 데이터를로드하고 필요한 배열을 초기화하는 데 문제가 있습니다. 좀 더 구체적으로, 나는 calloc으로 초기화 된 배열을 사용하여 fgets를 사용하려고 노력하고 있으며, 작동시키지 못한다. 이 기능은 아래에 있으며 도움을 주시면 감사하겠습니다.C 동적 메모리 할당 - 파일에서 데이터 읽기

편집 : 업데이트 된 코드는 다음 결함이있는 코드 아래에 있습니다.

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

void *load(const char *Filename); 

void *load(const char *Filename) 
{ 
    FILE* FID; 
    if ((FID = fopen(Filename, "r")) == NULL) 
    { 
     printf("File Unavailable.\n"); 
    } 
    else 
    { 
     int widthCount = 0, heightCount = 0; 

     char ReadVal; 
     while ((ReadVal = fgetc(FID)) != '\n') 
     { 
      if (ReadVal == ' ' || ReadVal == ',' || ReadVal == '\t') 
      { 
       widthCount++; 
      } 
     } 

     rewind(FID); 
     char* String = calloc(widthCount * 100, sizeof(char)); 
     while (fgets(*String, widthCount+1, FID) != EOF) 
     { 
      heightCount++; 
     } 
     double* Array = calloc(widthCount * heightCount, sizeof(double)); 
     rewind(FID); 
     int i = 0, j = 0; 
     char * pch; 
     while (fgets(*String, widthCount+1, FID) != EOF) 
     { 
      pch = strtok(String, " ,\t"); 
      while (pch != NULL) 
      { 
       Array[i][j] = strtod(pch, NULL); 
       pch = strtok (NULL, " ,\t"); 
       j++; 
      } 
      i++; 
      j = 0; 
     } 

     fclose(FID); 
     return Array; 

    } 

} 

수정 된 코드 : 이 솔루션은 비슷한 문제가보고 사람을 위해, 작동합니다.

void *load(const char *Filename) 
{ 
    FILE* FID; 
    if ((FID = fopen(Filename, "r")) == NULL) 
    { 
     printf("File Unavailable.\n"); 
     return NULL; 
    } 
    else 
    { 
     int widthCount = 0, heightCount = 0; 
     double *Array; 
     char Temp[100]; 
     while ((Temp[0] = fgetc(FID)) != '\n') 
     { 
      if (Temp[0] == '\t' || Temp[0] == ' ' || Temp[0] == ',') 
      { 
       widthCount++; 
      } 
     } 
     widthCount++; 
     //printf("There are %i columns\n", widthCount); 
     rewind(FID); 
     while (fgets(Temp, 99, FID) != NULL) 
     { 
      heightCount++; 
     } 
     //printf("There are %i rows\n", heightCount); 
     Array = (double *)calloc((widthCount * heightCount), sizeof(double)); 
     rewind(FID); 
     int i = 0; 
     while (!feof(FID)) 
     { 

      fscanf(FID, "%lf", &*(Array + i)); 
      fgetc(FID); 
      i++; 
     } 

     return Array; 
    } 
} 

답변

2

배열은 단지 포인터를 *(Array++) = strtod(pch, NULL);

+0

감사를 증가하는 대신 Array[i][j] = strtod(pch, NULL);의 2 차원 배열이 아닌, 그 잡은하지 않았다. 내 주요 문제는 fgets 명령을 지나가고있다. 내가 런타임에 결정 행 크기를 기반으로 각 행을 잡을 수 있어야합니다. –

+0

@ NathanTornquist 파일 형식 샘플을 제공하는 데 도움이 될 수 있습니다. 줄 너비가 어떻게 설정됩니까? etvc –

+0

줄 너비가 없습니다. 수업의 목표는 사용자가로드 할 데이터의 크기를 제공하도록하는 것이 었습니다. 그 값없이 모든 데이터를로드하기로 결정했습니다. 그것이 함수의 시작 부분에있는 너비와 높이의 목적입니다. –