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;
}
}
감사를 증가하는 대신
Array[i][j] = strtod(pch, NULL);
의 2 차원 배열이 아닌, 그 잡은하지 않았다. 내 주요 문제는 fgets 명령을 지나가고있다. 내가 런타임에 결정 행 크기를 기반으로 각 행을 잡을 수 있어야합니다. –@ NathanTornquist 파일 형식 샘플을 제공하는 데 도움이 될 수 있습니다. 줄 너비가 어떻게 설정됩니까? etvc –
줄 너비가 없습니다. 수업의 목표는 사용자가로드 할 데이터의 크기를 제공하도록하는 것이 었습니다. 그 값없이 모든 데이터를로드하기로 결정했습니다. 그것이 함수의 시작 부분에있는 너비와 높이의 목적입니다. –