私はC言語にかなり慣れておらず、一般的にメモリの割り当て/ポインターの使用を行っています。とにかく、私はファイルの読み取り、それらの値の構造体への配置などを試していました。何をしたいのかは正確にわかっており、もちろんプログラムは実行されますが、出力が正しくなく、数字と文字がごちゃ混ぜになっています。
各行の新しい情報を含むテキスト ファイルがあります。各線は 1 つのオブジェクトを表します。
ファイル内の行は次のようになります。
肉サーロイン 6.55 8 8.50 4
全体として、すべてのオブジェクトを配列に格納できるようにしたいと考えていPRODUCT
ます (したがって、構造体の配列があります)。そこで、ポインタを使用してメモリを割り当て、行数を使用して、そのポインタを read という関数に送信しようとしました。読み取りでは、ポインターを介して各構造体を配列に追加します。プログラムはクラッシュしません。出力が正しくないだけで、その理由がわかりません。それはおそらくポインタを使ったものです。誰かが私を助けることができれば、本当に感謝しています。どんな助けでも素晴らしいでしょう。
//prototype
void read(pointerToArr);
typedef struct
{
char supType[15];
char prodName[15];
double wholePrice;
int quantWhole;
double retPrice;
int retProdQuantity;
}PRODUCT;
FILE *fr;
int lineCount = 0;
int main()
{
PRODUCT *ptr;
int i;
char check[50];
fr = fopen("ttt.txt", "r");
while(fgets(check, sizeof(check), fr)!= NULL)
{
if(check[0] != '\n')
{
lineCount++;
}
}
// allocate memory for array based on line count.
PRODUCT prodContainter[lineCount];
ptr = (PRODUCT*)malloc(sizeof(PRODUCT)*lineCount);
ptr = prodContainter;
read(ptr);
//print after adding to array via pointer from other
//function. this was a test.
for(i = 0; i < lineCount; i++)
{
printf("%s ", prodContainter[i].supType);
printf("%s ", prodContainter[i].prodName);
printf("%f ", prodContainter[i].wholePrice);
printf("%d ", prodContainter[i].quantWhole);
printf("%f ", prodContainter[i].retPrice);
printf("%d\n\n", prodContainter[i].retProdQuantity);
}
return 0;
}
void read(PRODUCT *pointerToArr)
{
// objective in this method is to read in data from the file, create an object for every line and
// then use the pointer array to add those objects to prodConstainer up above.
char supplyName[15];
char productName[15];
double wholeP = 0;
int quantityWhole = 0;
double retailPrice = 0;
int retailProductQuant = 0;
while(fscanf(fr, "%s %s %lf %d %lf %d", supplyName, productName, &wholeP, &quantityWhole, &retailPrice, &retailProductQuant) == 6)
{
PRODUCT record;
int i;
strcpy(record.supType, supplyName);
strcpy(record.prodName, productName);
record.wholePrice = wholeP;
record.quantWhole = quantityWhole;
record.retPrice = retailPrice;
record.retProdQuantity = retailProductQuant;
for(i = 0; i < lineCount; i++)
{
pointerToArr[i] = record;
}
}
fclose(fr);
}