0

つまり、基本的にこのプロジェクトはCで行われます。顧客/注文システムを設計する必要があります。このシステムでは、顧客は複数の注文を行うことができますが、各注文は単一の製品タイプに制限されます。顧客ID、製品名、価格、および注文時間を含む構造体「orders」を作成しました。時間を計算するコードは次のとおりです。

        // computing order time
        time_t timeorder;
        char * displayT;
        timeorder = time(NULL);
        // convert time to string so that it can be displayed
        displayT= ctime(&timeorder);
        printf("Your order time is: %s\n", displayT); //check if time displays correctly
        newOrders11[count13].timeorder = displayT;

直後に、構造体'orders'がファイルに書き込まれます。ユーザーが注文した後、ID番号を入力すると、最新の注文を表示できるようになります。ただし、注文がファイルから読み取られると、ユーザーが(最新ではなく)最初に行った注文が表示されます。ファイルから読み取るためのコードは次のとおりです。

 while (count13<=MAXORDERSTOBEMADE && (fread(&newOrders11[count13], sizeof(struct orders), 1, filePointer))==1)
{
    if(ID == newOrders11[count13].ID) {
        printf("These are the details for order %i\n", count13);

        if(count13>=0)
        printf("Customer ID: %d\n", newOrders11[count13].ID);
        printf("Product Name: %s\n", newOrders11[count13].productname);
        printf("Price: %f\n", newOrders11[count13].total);
    } else {
        continue;
    }
    count13++;
}

誰かが私がこれについてどうすべきか知っていますか?申し訳ありませんが、私はまだC初心者です。これはCでの私の最初のプログラムです。

4

2 に答える 2

0

ループ内whileでは、顧客 ID に対してのみテストしているため、その顧客の最初のレコードが一致します。

ファイル内のレコードがタイムスタンプ順に並べられていることを考えると、ファイルの最初からではなく、最後から読み取りを開始することをお勧めします。

fseek(filePointer, -sizeof (struct orders), SEEK_END);
while (count13 <= MAXORDERSTOBEMADE && (fread(...) == 1))
{
  if (ID == ...)
  {
     ...
  }    
  else
  {
    fseek(filePointer, -2 * sizeof(struct orders), SEEK_CUR);
  }
}

警告: SEEK_ENDバイナリ ストリームではサポートされていない可能性があり、任意のオフセットはテキスト ストリームでは意味がない可能性があります。

7.21.9.2 fseek 関数

2fseek関数は、 が指すストリームのファイル位置標識を設定しますstream。読み取りエラーまたは書き込みエラーが発生した場合、ストリームのエラー インジケータが設定され、fseek失敗します。

3 バイナリ ストリームの場合、ファイルの先頭からの文字数で測定された新しい位置は、 で指定された位置にオフセットを追加することによって取得されwhenceます。指定された位置は、 whence が の場合はファイルの先頭、 の場合SEEK_SETはファイル位置指示子の現在の値、 の場合はファイルのSEEK_CUR終わりですSEEK_END。バイナリ ストリームは、値が のfseek呼び出しを有意にサポートする必要はありません。 4 テキスト ストリームの場合は、ゼロにするか、whenceSEEK_END

offsetoffsetftellは、同じファイルに関連付けられたストリーム上の関数への以前の成功した呼び出しによって返された値であり、 であるwhence必要がありますSEEK_SET
于 2013-01-08T12:29:55.623 に答える
0

これ以上注文が表示されなくなるまで、ファイル全体をスキャンする必要があります。つまり、EOF (ファイルの終わり) が表示された場合は、最後に見つかった一致を出力する必要があります。

  • そのため、ファイル全体を一度に 1 レコードずつ読み取ります。
  • 一致が見つかった場合は、後で印刷するために一時的に変数に保存します (以前の一致は上書きされます。最後に見つかったものだけを覚えておく必要があります)。

(オプションで、タイムスタンプを比較し、古いタイムスタンプとの一致を無視することもできます。ファイルがタイムスタンプ順に書き込まれている場合、この手順は省略できます)

  • ファイル全体を読み取った後、最新のレコードを保存した変数の値を出力します。
于 2013-01-08T12:39:08.413 に答える