Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用与文件B共享的元素(外键)访问文件A中的数据_C_File_Foreign Keys_Structure - Fatal编程技术网

C 使用与文件B共享的元素(外键)访问文件A中的数据

C 使用与文件B共享的元素(外键)访问文件A中的数据,c,file,foreign-keys,structure,C,File,Foreign Keys,Structure,我有一个car.txt文件和一个reservation.txt文件。这两个文件都有一个保留号(Rxxx) 我想使用reservation.txt中的预订号打印带有相应预订号的汽车详细信息。或者更准确地说,我正试图找到在任何给定日期可用的所有汽车的详细信息 car.txt: (从左到右:保留、carID、carYOM、carMake、carModel、carFuel、分类) reservation.txt: (从左到右:reservationID、customerID、reservationSta

我有一个car.txt文件和一个reservation.txt文件。这两个文件都有一个保留号(Rxxx)

我想使用reservation.txt中的预订号打印带有相应预订号的汽车详细信息。或者更准确地说,我正试图找到在任何给定日期可用的所有汽车的详细信息

car.txt: (从左到右:保留、carID、carYOM、carMake、carModel、carFuel、分类)

reservation.txt: (从左到右:reservationID、customerID、reservationStartDate、reservationStartTime、reservationEndDate、reservationEndTime)

如果我输入任何日期,它只会确定输入的日期是否在预订开始日期和结束日期之间。“所有的车都有”

但是,如果我输入2012年2月13日,它会打印7次“cars.txt中没有匹配的resID”

有关守则:

#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);
}

输入今天日期:2012年2月13日

所有的车都有


按任意键继续…

您没有正确计算车辆和预订的数量: 在这两个循环中(一个读取cars,另一个读取reservation),您使用
reccount
作为计数器。 您需要使用两个计数器,
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++){
  • 读取文本文件时应使用fscanf:

    if(fscanf(filehandle, "R%03u...\n", &car[carcount].reservationID, ...) == EOF)
        break;
    
    这将使您的文件扫描更加健壮,并将其变成一行

  • 尽可能避免字符串比较。相反,使用“真实数据类型”

  • 真的,避免走狗。的确,Linux内核开发人员使用它们,但他们知道自己在做什么
  • 外部for循环包含一个break语句,在任何情况下,该语句都会在第一次运行后中断循环执行。你可能忘了在“else”之后加括号
  • 我认为您的程序流逻辑包含一些错误。您可以在每辆车之后
    printf(“\n\n没有匹配的resID in cars.txt\n”)

  • 一般来说,您是否尝试过调试代码?gdb是一个非常强大的工具。您可以使用它来跟踪程序流程,随时暂停程序查看可变内容。

    我已经解决了这个问题。问题是使用resID作为公共标识符而不是carID


    谢谢大家的帮助。

    您对两个阵列只使用一个计数器,即
    car
    reservation
    。您确定c是正确的选择吗?你的任务听起来像是一个完美的例子,说明了SQL的用途。为了我的目的,代码必须是c语言。
    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 . . .
    
    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++){
    
    for(carcount = 0; carcount < CAR_MAX; carcount++)
    
    if(fscanf(filehandle, "R%03u...\n", &car[carcount].reservationID, ...) == EOF)
        break;