Я читаю в структуре из двоичного файла, содержащего 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;
}