2012-05-03 4 views
0

私はファイルcar.txtとファイルreservation.txtを持っています。両方のファイルに予約番号(Rxxx)があります。ファイルB(外部キー)と共有する要素を使用してファイルAからデータにアクセスする

私はreservation.txtから予約番号を使用して、対応する予約番号で車の詳細を印刷したいと考えています。または、より正確には、私はいつでも利用可能なすべての車の詳細を見つけることを試みています。

car.txt: (LETから右へ:現在の予約、carID、carYOM、carMake、carModel、carFuel、catagory): (LETから右へ:

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 

reservation.txt予約ID、得意先、reservationStartDate、reservationStartTime、reservationEndDate、reservationEndTime)

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と入力すると、「no matching resID in cars.txt」が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); 
} 

任意の助けいただければ幸いです。 :)

EDIT:コードを更新しました。

これは出力、まだ間違った:(です:

は、今日の日付を入力してください。cars.txt

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

一致残油は、今日を入力していません日付:13/02/2012

すべての車を利用できます

任意のキーを押して続行し...

+0

両方の配列に** carと 'reservation'という**カウンタを1つだけ使用します。 – alk

+1

ここで正しいのはCですか?あなたのタスクは、SQLが何のために作られたかの完全な例のように聞こえます。 –

+0

コードは私の目的のためにcでなければなりません。 –

答えて

0

私はこの問題を修正しました。問題は、carIDではなく、共通IDとしてresIDを使用することでした。

皆さんありがとうございます。

0

あなたは正しく車や予約数をカウントしていない:両方のループで (車を読み込ん1、および予約を読み込む1)、あなたがしていますカウンタとしてreccountを使用します。 carcountrescountの2つのカウンタを使用する必要があります。 その後、forループでcarcountとrescountを使用する必要があります。あなたの現在のコードは、(明白なバグが固定されている場合でも)、セグメンテーションフォールトまたは与えるので、あなたはまた、車や予約配列の場合と同様に、car_tとreservation_t内部文字配列のためのメモリを割り当てる動的に検討すべきである

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++){ 

入力ファイルの行数がMAX_CAR/MAX_RESを超えたり、行内の文字列が長すぎたりすると、予期しない結果が発生します。

更新あなたの更新されたコードにはいくつかの問題が残ってい :

  • あなたは、文字列変数に文字列をすることになっていないデータを保存しないでください。可能な限り整数または符号なし変数、特にIDと日付に格納します。
  • 日付について:time(NULL)を使用すると、現在の時刻をUNIXの時刻形式で取得できます( "seconds from 1970-01-01 00:00")。すべての日付をUNIX時刻に整数として格納します。
  • ファイルを読み込むときcarcountは、テキストファイルを読み込むときは、fscanfを使用する必要がありますCAR_MAX

    for(carcount = 0; carcount < CAR_MAX; carcount++) 
    
  • よりも大きい場合は、チェック:

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

    これはあなたのファイルスキャンをはるかに堅牢になり、それを1ライナーに変えてください。

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

  • 実際には、ごちそうを避けてください。 Linuxカーネルの開発者が使用しているのは事実ですが、彼らは何をしているのかを知っています。
  • 外側のforループには、いずれの場合も最初の実行後にループ実行を中断するbreak文が含まれています。あなたはたぶん 'else'の後に中かっこを忘れてしまったでしょ
  • あなたのプログラムフローロジックにはいくつかのエラーが含まれていると思います。すべての車の後にprintf("\n\nno matching resID in cars.txt\n")

一般的に、コードのデバッグを試しましたか? gdbは本当に強力なユーティリティです。これを使用してプログラムの流れに従うことができ、いつでも変数の内容を見ながらプログラムを一時停止することができます。

+0

Iveは自分のコードで手抜きましたが、まだ動作しません。 –

関連する問題