Использование функции STRCMP для поиска даты внутри структуры - PullRequest
0 голосов
/ 02 апреля 2020

Я читаю в структуре из двоичного файла, содержащего 3 переменные: температура, скорость ветра и направление ветра. Я пытаюсь создать метод поиска метки даты, записанной в файл под переменной time_t, которая находится в форме день / месяц / год. Я начинаю с открытия файла и чтения его пунктов. Затем я использую strcmp для сравнения введенной пользователем строки даты со значением time_t в структуре файла. Однако всякий раз, когда я ввожу правильную дату, таким образом, strcmp должен возвращать 0, он не возвращает 0. Когда я ввожу значение ниже, чем time_t, я получаю возвращение strcmp, равное -1, и наоборот, для значения, превышающего time_t, я получаю возврат из 1, это просто не будет работать, когда они равны. Вариант 2 - это когда я внедряю Поиск.

Буду признателен за любой совет.

Код:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#pragma warning(disable : 4996)

struct readings {
    double temperature;
    double wind_direction;
    double wind_speed;
    time_t time;
};

/*
int compare(const void* a, const void* b)
{
    int search1 = *(int*)a;
    int search2 = *(int*)b;

    if (search1 == search2)
    {
        return 0;
    }
    else if (search1 < search2)
    {
        return -1;
    }
    else if (search1 > search2) {
        return 1;
    }

}*/


int main(void)
{
    struct readings* readings = NULL;
    int option;
    printf_s("Welcome to Data Acquisition Program\n");
    printf_s("Options are as follows:\n 1:Load File\n 2:Search Weather by date\n 3:View Monthly Data\n 4:Export to Excel\n 5:Exit\n");
    printf_s("Enter an option: ");
    scanf_s("%d", &option);

    if (option == 1)
    {

        FILE* pFile;
        errno_t error;
        int num_readings;

        time_t t;
        struct tm* tmp;
        char MY_TIME[50];
        time(&t);


        error = fopen_s(&pFile, "weather.bin", "rb");

        if (error == 0)
        {


            fread(&num_readings, sizeof(int), 1, pFile);
            readings = malloc(sizeof(struct readings) * num_readings);
            fread(readings, sizeof(struct readings), num_readings, pFile);

            for (int i = 0; i < num_readings; i++)
            {
                printf_s("Temperature: %lf\n", readings[i].temperature);
                printf_s("Wind Direction: %lf\n", readings[i].wind_direction);
                printf_s("Wind Speed: %lf\n", readings[i].wind_speed);
                tmp = localtime(&readings[i].time);
                //strftime(MY_TIME, sizeof(MY_TIME), "%x", tmp);
                strftime(MY_TIME, sizeof(MY_TIME), "%x - %I:%M%p", tmp);
            }   printf_s("Date & Time: %s\n", MY_TIME);
            fclose(pFile);
        }
        else { printf_s("Error: %d", error); }
    }



    if (option == 2)
    {
        //searching in file
        //int* result = 0;
        char date[20];

        FILE* pFile;
        errno_t error;
        int num_readings;

        time_t t;
        struct tm* tmp;
        char MY_TIME[50];
        time(&t);

        error = fopen_s(&pFile, "weather.bin", "rb");

        fread(&num_readings, sizeof(int), 1, pFile);
        readings = malloc(sizeof(struct readings) * num_readings);
        fread(readings, sizeof(struct readings), num_readings, pFile);

        if (readings != NULL)
        {

            for (int i = 0; i < num_readings; i++)
            {
                tmp = localtime(&readings[i].time);
                strftime(MY_TIME, sizeof(MY_TIME), "%x", tmp);
                printf_s("Date & Time: %s\n", MY_TIME);
            }

            getchar();
            printf_s("Enter the Date you wish to search for in the form month/day/year: \n");
            fgets(date, sizeof(int), stdin);

            int result;

            // comparing strings str1 and str2
            result = strcmp(date, MY_TIME);
            printf("strcmp = %d\n", result); //returns 0 if equal

            //result = (int*)bsearch(&date, readings, num_readings, sizeof(struct readings), compare);
            //returns NULL if not equal and returns 1 if equal

            if (result == 0)
            {
                printf_s("Date found!\n %d\n", date);
                for (int i = 0; i < num_readings; i++)
                {
                    printf_s("Temperature is: %lf", readings[i].temperature);
                    printf_s("Wind Direction is: %lf", readings[i].wind_direction);
                    printf_s("Wind Speed is: %lf", readings[i].wind_speed);
                }
            }
            else
            {
                printf_s("Date not found\n");
            }
        }
        else
        {
            printf_s("Error: %d\n");
        }

        free(readings);
        return 0;
    }






    if (option == 4)
    {
        //reading data from binary file then writing it to csv file
        FILE* pFile;
        FILE* aFile;

        errno_t error;
        int num_readings;

        time_t t;
        struct tm* tmp;
        char MY_TIME[50];
        time(&t);

        error = fopen_s(&pFile, "weather.bin", "rb");
        if (error == 0)
        {
            fread(&num_readings, sizeof(int), 1, pFile);
            readings = malloc(sizeof(struct readings) * num_readings);
            fread(readings, sizeof(struct readings), num_readings, pFile);
            fclose(pFile);
        }
        else { printf_s("Error: %d", error); }


        error = fopen_s(&aFile, "weather.txt", "w");

        if (error == 0)
        {
            fprintf(aFile, "%d readings were saved\n", num_readings);

            for (int i = 0; i < num_readings; i++)
            {
                fprintf(aFile, "Temperature: %lf\n", readings[i].temperature);
                fprintf(aFile, "Wind Direction: %lf\n", readings[i].wind_direction);
                fprintf(aFile, "Wind Speed: %lf\n", readings[i].wind_speed);
                tmp = localtime(&readings[i].time);
                strftime(MY_TIME, sizeof(MY_TIME), "%x - %I:%M%p", tmp);
            }   fprintf(aFile, "Date & Time: %s\n", MY_TIME);
            fclose(aFile);
        }
        else { printf_s("Error: %d", error); }

    }



    if (option == 5)
    {
        exit(0);
    }


    return 0;
}
...