Настройка fseek для прочитанного числа

Я не могу получить правильные числа из следующего текстового файла. Я могу получить только из ранних строк файла. Я использую функцию fseek, но она не работает. Например, я хочу получить число в позиции 1024. В моем файле последовательно 32 числа с плавающей запятой.

#DEFINE N 1026 //The number that I want read
#DEFINE SIZEFLOAT 9 //-1.849728 Nine digits
float data
fseek(arq, (((N-1) * SIZEFLOAT) + ( N / 31.0 ) ) * sizeof(char), SEEK_SET);
fscanf(arq, "%f", &data);

Вот как выглядит мой файл данных:

-1.849728+3.491089+2.169375-5.024082-4.683389-1.621853-3.976242+4.346661-2.634182-0.647340-4.725379+4.996003+0.965050+1.515107-4.365746+4.977995-2.800827+1.541677-1.292648-1.701067-0.883889-0.081253+3.928178+2.617783-2.590111+2.277843+0.856840+1.676386-4.604098-1.937928-2.174185-1.333826
-3.566839+5.115190-1.237908-3.130227-1.626663-0.094150-3.903567+0.859154+4.378510-3.508946+0.735157+0.223560+3.126161+1.489411+0.081555-4.794665-2.088912+3.908907-1.375732+2.147199-1.292346-2.567554-0.355018+1.237543+4.830288-4.618177-2.206071-4.893809-1.436105+0.739744-1.107636+0.117056
... More rows of data similar to the above...

Полный файл можно найти здесь.


person ericmoraess    schedule 29.05.2014    source источник
comment
Ссылки на Pastebin здесь неприемлемы, либо поместите код в вопрос, либо, если он слишком длинный, сделайте SSCCE.   -  person sashoalm    schedule 29.05.2014
comment
@sashoalm Это не код в pastebin, это довольно скучный файл данных. Я отредактировал, чтобы включить репрезентативную часть, и оставил скучную часть в pastebin.   -  person Sergey Kalinichenko    schedule 29.05.2014
comment
Не могли бы вы уточнить логику расчета fseek? Что означает ( N / 31.0 )? Зачем?   -  person Soren    schedule 30.05.2014


Ответы (1)


В моем файле последовательно 32 числа с плавающей запятой.

В частности, ваш текстовый файл содержит строки из 32 чисел с плавающей запятой, отформатированных как текст, в девяти позициях; каждая строка имеет в конце символ конца строки.

Имея эту информацию, вы можете вычислить смещение k-го числа, сначала разделив его на 32, чтобы получить строку, затем умножив номер строки на размер одной строки и добавив смещение в текущей строке, например это:

#define NUM_SIZE 9
#define ROW_NUM_COUNT 32
#define ROW_SIZE (ROW_NUM_COUNT*NUM_SIZE+1)
...
int k = 123; // The index of the number that you need to read
int offset = ROW_SIZE(k / ROW_NUM_COUNT) * ROW_SIZE + NUM_SIZE * (k % ROW_NUM_COUNT);
...
float data;
fseek(arq, offset);
fscanf(arq, "%f", &data);
person Sergey Kalinichenko    schedule 29.05.2014