Как перейти в начало строки с помощью fseek()

У меня есть функция, в которой я проверяю, совпадают ли переданные аргументы с аргументами в файле .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;
};

Обратите внимание, что длина строки не является фиксированным числом, так как «имя» может быть другим.


person massakrienen    schedule 31.10.2015    source источник
comment
С fscanf_s(rPtr, "%14s%lf%lf", ... код потерял способность обнаруживать строку. Используйте fgets().   -  person chux - Reinstate Monica    schedule 01.11.2015


Ответы (1)


Я бы использовал ftell для получения смещения начала каждой строки, затем прочитал строку с fgets и проанализировал строку с sscanf.

person user3386109    schedule 31.10.2015