fseek () устанавливает указатель на неправильную позицию

У меня есть файл .dat со следующей структурой:

Object name | Area | Length |Form Factor

Я пытаюсь найти, какой объект имеет минимальную площадь. Я прочитал весь файл и отслеживаю объект с минимальной площадью и его положение с помощью ftell (). Когда я закончу чтение файла, я установлю индикатор положения потока на то, что получу из ftell (). Затем я читаю эту строку как мой конечный результат, но сейчас я читаю не ту строку.

objects.dat:

toy1 12785.00 550.70 23.22
toy2 11506.50 495.63 0.48
Pen 35008.65 1450.98 0.17
Pencil 42788.35 1773.42 0.209
card7 128433.00 1552.67 0.67

Код:

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

using namespace std;

int main()
{
FILE *cfPtr;
errno_t err;

char name[15];
double area, length, fF;
double minArea = 100000.0;
long address, minAreaAdd;

char string[100];

if ((err = fopen_s(&cfPtr, "objects.dat", "r")) != 0)   // Check if we can reach the file
printf("The file 'objecs.dat' was not opened to read.\n");
else
{
while (fgets(string, 100, cfPtr))
{
address = ftell(cfPtr);
sscanf_s(string,"%s %lf %lf %lf", &name, sizeof name, &area, &length, &fF);

if (area < minArea)
{
minArea = area;
minAreaAdd = address;
}
}

cout << "Min Area: " << minArea << " Address: " << minAreaAdd << "\n\n";

fseek(cfPtr, minAreaAdd, SEEK_SET);
fgets(string, 100, cfPtr);
sscanf_s(string, "%s %lf %lf %lf", &name, sizeof name, &area, &length, &fF);

cout << "Name: " << name << " Area : " << area << " Length: " << length << " Form factor: " << fF << "\n";

fclose(cfPtr);
}
return 0;
}

Выход:

Min Area: 11506.5 Address: 55

Name: Pen Area : 35008.7 Length: 1450.98 Form factor: 0.17

0

Решение

Как указано в «1201ProgramAlarm», вы получаете адрес после того, как прочитали строку, которую хотите сохранить. То есть вы используете ftell после fgets,

Что происходит то fgets перемещает индикатор положения файла во время чтения данных. Это потому что fgets Нужно подготовить файл для следующей операции чтения, иначе вы застряли бы в той же позиции, читая те же данные.

Вы должны полностью изменить эту логику. Вот один пример:

address = -1
do
{
if (address >= 0) {
sscanf_s(string,"%s %lf %lf %lf", &name, sizeof name, &area, &length, &fF);

if (area < minArea)
{
minArea = area;
minAreaAdd = address;
}
}
address = ftell(cfPtr);
} while (ret = fgets(string, 100, cfPtr));
1

Другие решения

Когда вы получите положение файла и сохраните его в address, это после того, как вы прочитали строку, поэтому, когда вы пытаетесь получить ответ, вы получите строку после правильный.

3

По вопросам рекламы [email protected]