У меня есть функция, в которой я проверяю, совпадают ли переданные аргументы с аргументами в файле .dat с погрешностью.
Что я хотел бы сделать, так это найти лучший матч. Итак, я читаю весь файл и отслеживаю строку, которая дает мне наилучшее совпадение. После того, как я закончу чтение файла, я хотел бы вернуться к этой конкретной строке и прочитать ее как мой окончательный результат.
Но я не мог сделать эту часть «возвращения назад».
Моя функция:
int isObjectMatches(FILE *rPtr, struct objectDatabaseList *db, double area, double length)
{
double sum;
errno_t err;
double const errorThreshold = 0.4;
double minError = 100.0;
int lineNo = 0, bestMatchNo = 0;
bool match = false;
if ((err = fopen_s(&rPtr, "objects.dat", "r")) != 0)
printf("Couldn't open the file to read.\n");
else
{
rewind(rPtr);
while (fscanf_s(rPtr, "%14s%lf%lf", db->dName, sizeof db->dName, &db->dArea, &db->dLength) == 3)
{
lineNo++;
sum = pow((1 - (area / db->dArea)), 2) + pow((1 - (length / db->dLength)), 2);
if (sum > errorThreshold) // No possible match
{
continue; // Keep reading
}
else
if (sum < minError) // One possible match
{
minError = sum;
bestMatchNo = lineNo; // Take the line number
match = true;
continue; // Keep reading
}
}
if (match)
{
fseek(rPtr, (bestMatchNo - 1)*sizeof(struct objectDatabaseList), SEEK_SET); // Find the line
fscanf_s(rPtr, "%14s%lf%lf", db->dName, sizeof db->dName, &db->dArea, &db->dLength);
fclose(rPtr);
return 0;
}
}
fclose(rPtr);
return -1;
}
И моя структура:
struct objectDatabaseList
{
char dName[15];
double dArea;
double dLength;
};
Обратите внимание, что длина строки не является фиксированным числом, так как «имя» может быть другим.
fscanf_s(rPtr, "%14s%lf%lf", ...
код потерял способность обнаруживать строку. Используйтеfgets()
. - person chux - Reinstate Monica   schedule 01.11.2015