0

ファイルcar.txtとファイルreservation.txtがあります。どちらのファイルにも予約番号 (Rxxx) があります。

対応する予約番号で車の詳細を印刷するために、reservation.txt の予約番号を使用したいと考えています。より正確には、特定の日付に利用可能なすべての車の詳細を見つけようとしています.

car.txt:(左から右へ:reservationID、carID、carYOM、carMake、carModel、carFuel、category)

R002;V001;2003;Toyota;Camry;Petrol;Budget
R007;V002;2005;Toyota;Prius;Petrol;Economy
R001;V003;1999;Ford;Falcon;Petrol;Midsize
R008;V004;2007;Ford;Territory;Diesel;Fullsize
R011;V005;2010;Ferrari;599;Petrol;Fullsize
R035;V006;1998;Holden;Comadore;Diesel;Midsize
R006;V007;2008;Honda;Civic;Petrol;Budget
R004;V008;2000;Mazda;MX5;Petrol;Economy

reserved.txt: (左から右へ: 予約 ID、顧客 ID、予約開始日、予約開始時刻、予約終了日、予約終了時刻)

R001;C005;12/02/2012;09:15A.M;15/03/2012;05:00P.M
R002;C002;15/04/2012;10:00A.M;22/04/2012;10:30A.M
R003;C003;16/01/2012;02:11P.M;15/04/2012;12:00P.M
R004;C004;05/05/2012;03:00P.M;08/05/2012;10:40A.M
R005;C005;15/04/2012;10:00A.M;23/04/2012;05:00P.M
R006;C006;11/04/2012;05:30P.M;15/04/2012;10:00A.M
R010;C008;15/05/2012;03:15P.M;18/05/2012;11:00A.M
R011;C007;15/04/2012;11:40P.A;23/04/2012;09:00A.M

任意の日付を入力すると、入力された日付が予約開始日と終了日の間にあるかどうかを判断するポイントまでしか取得できません。「すべての車が利用可能です」。

ただし、13/02/2012 と入力すると、「cars.txt に一致する resID がありません」と 7 回出力されます。

問題のコード:

#include <stdio.h>
#include <string.h>
#define MAX_CAR 100
#define MAX_RES 100

int main(){

    typedef struct{                 //car struct
        char reservationID[20];
        char carID[20];
        char carYOM[20];
        char carMake[20];
        char carModel[50];
        char carFuel[20];
        char catagory[20];
    } car_t;

    typedef struct{                 //res struct
        char reservationID[20];
        char customerID[20];
        char reservationStartDate[20];
        char reservationStartTime[20];
        char reservationEndDate[50];
        char reservationEndTime[20];
    } res_t;

    car_t car[MAX_CAR];             //car array
    res_t reservation[MAX_RES];     //res array
    FILE *carHandle;
    FILE *resHandle;
    char line[100];
    char *item;
    int rescount = 0;
    int carcount =0;
    int k;
    int i;
    int option;
    char choice[20];    

    resHandle = fopen("reservation.txt","r");    

    while (fgets(line, 99, resHandle)){                         //cut up the reservation file line by line and put the bits into the res array.
        item = strtok(line,";");
        strcpy(reservation[rescount].reservationID,item);
        item = strtok(NULL,";");
        strcpy(reservation[rescount].customerID,item);
        item = strtok(NULL,";");
        strcpy(reservation[rescount].reservationStartDate,item);
        item = strtok(NULL,";");
        strcpy(reservation[rescount].reservationStartTime,item);
        item = strtok(NULL,";");
        strcpy(reservation[rescount].reservationEndDate,item);
        item = strtok(NULL,"\n");
        strcpy(reservation[rescount].reservationEndTime,item);
        rescount++;
    }

    fclose(resHandle);

    carHandle = fopen("car.txt","r");    

    while (fgets(line, 99, carHandle)){                                 //cut up the car file line by line and put the bits into the car array.
        item = strtok(line,";");
        strcpy(car[carcount].reservationID,item);
        item = strtok(NULL,";");
        strcpy(car[carcount].carID,item);
        item = strtok(NULL,";");
        strcpy(car[carcount].carYOM,item);
        item = strtok(NULL,";");
        strcpy(car[carcount].carMake,item);
        item = strtok(NULL,";");
        strcpy(car[carcount].carModel,item);
        item = strtok(NULL,";");
        strcpy(car[carcount].carFuel,item);
        item = strtok(NULL,"\n");
        strcpy(car[carcount].catagory,item);
        carcount++;
    }

    fclose(carHandle);

    printf("Enter todays date:");
    scanf("%s", choice);
    for (k=0;k<=rescount; k++){
        if (strcmp(choice,reservation[k].reservationEndDate)<0 && strcmp(choice,reservation[k].reservationStartDate)>0){
            for (i=0;i<=carcount; i++){
                if (strcmp(car[k].reservationID,reservation[i].reservationID)==0){
                    printf("\nreservationID: %s\nreservationStartTime: %s\ncustomerID: %s\ncarid: %s\nyom: %s\nmake: %s\nmodel: %s\nfueltype: %s\ncategory: %s\n\n", car[k].reservationID, reservation[i].reservationStartTime, reservation[i].customerID, car[k].carID, car[k].carYOM, car[k].carMake, car[k].carModel, car[k].carFuel, car[k].catagory);
                    //printf("This works");
                    goto outofloop;
                }else printf("\n\nno matching resID in cars.txt\n");
            }
        }
        else printf("\nall the cars are available\n");
        break;
    }
    outofloop:

    return(0);
}

どんな助けでも大歓迎です。:)

編集: コードを更新しました。

これは出力ですが、まだ間違っています:(:

今日の日付を入力してください:13/02/2012

cars.txt に一致する resID がありません

reservationID: R002
reservationStartTime: 10:00A.M
customerID: C002
carid: V001
yom: 2003
make: Toyota
model: Camry
fueltype: Petrol
category: Budget

Press any key to continue . . .

今日の日付を入力してください:13/02/2012

すべての車が利用可能です

何かキーを押すと続行します...

4

2 に答える 2

0

車と予約の数を正しくカウントしていません。両方のループ (車を読み取るループと予約を読み取るループ) でreccount、カウンターとして使用しています。との 2 つのカウンターを使用する必要がありcarcountますrescount。その後、 for ループで carcount と rescount を使用する必要があります。

for (k=0;k<=rescount; k++){
    if (strcmp(choice,reservation[k].reservationEndDate)<0 && strcmp(choice,reservation[k].reservationStartDate)>0){
        for (i=0;i<=carcount; i++){

また、現在のコードは (明らかなバグが修正された場合でも) セグメンテーション違反を起こしたり、入力時に予期しない結果が発生したりするため、car 配列と reserve 配列、および car_t と reserve_t 内の文字配列に動的にメモリを割り当てることを検討する必要があります。ファイルの行が MAX_CAR/MAX_RES を超えているか、行の文字列が長すぎます。

更新 更新されたコードにはまだいくつかの問題があります。

  • 文字列変数に文字列ではないデータを格納しないでください。可能な限り、整数または符号なし変数、特に ID と日付に格納します。
  • 日付について言えばtime(NULL)、UNIX 時間形式 (「1970-01-01 00:00 からの秒数」) で現在の時刻を取得するために使用するだけです。すべての日付を UNIX 時間の整数として格納します。
  • ファイルを読み取るときに、carcount が CAR_MAX より大きいかどうかを確認します

    for(carcount = 0; carcount < CAR_MAX; carcount++)
    
  • テキストファイルを読み取るときは、fscanf を使用する必要があります。

    if(fscanf(filehandle, "R%03u...\n", &car[carcount].reservationID, ...) == EOF)
        break;
    

    これにより、ファイルのスキャンがより堅牢になり、ワンライナーに変わります。

  • 文字列の比較は可能な限り避けてください。代わりに、「実際のデータ型」を使用してください。

  • 本当に後藤を避けてください。Linux カーネル開発者がそれらを使用しているのは事実ですが、彼らは自分が何をしているのかを知っています。
  • 外側の for ループには、いずれの場合も、最初の実行後にループの実行を中断する break ステートメントが含まれています。おそらく「else」の後の中括弧を忘れているでしょう。
  • プログラム フロー ロジックにエラーが含まれていると思います。あなたprintf("\n\nno matching resID in cars.txt\n")はすべての車の後にいます。

一般的に、コードのデバッグを試みましたか? gdb は非常に強力なユーティリティです。これを使用して、プログラムの流れをたどり、プログラムを一時停止して変数の内容をいつでも確認できます。

于 2012-05-03T15:24:45.620 に答える
0

問題を修正しました。問題は、carID の代わりに resID を共通の識別子として使用していたことです。

みんな助けてくれてありがとう。

于 2012-05-07T12:13:40.187 に答える