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 –
私は線幅がありません。クラスの目的は、ユーザーにロードするデータのサイズを提供させることでした。私はこれらの値のないデータをすべて読み込もうと決めました。これは、関数の先頭にある幅と高さのカウントの目的です。 –