функция чтения, пропускающая назад 4086 байтов вместо 6 байтов вперед в файле - PullRequest
0 голосов
/ 02 марта 2020

У меня действительно странная проблема на моей руке. Я читаю файл и запускаю фред, и вместо того, чтобы пропустить вперед 6 байтов, как это должно быть, он идет назад 4092-6 байтов!

Вот вызов:

int bread = sizeof(RoughnessReadPoint) * fread(&roughnessBuffer, sizeof(RoughnessReadPoint), 1, ptr);

Вот связанная структура:

struct RoughnessReadPoint
{
   S8 x;
   S8 y;
   S8 z;
   S8 x2;
   S8 y2;
   S8 z2;
};

Вот трассировка GDB, показывающая чтение:

216         int bread = sizeof(RoughnessReadPoint) * fread(&roughnessBuffer, sizeof(RoughnessReadPoint), 1, ptr);
(gdb) p ptr->_IO_read_ptr
$5 = 0x5555557cce42 "\002\017\374\016\002\373˱N\001\002\017\374\017\020\020"
(gdb) n
217             totalBytesRead += bread;
(gdb) p ptr->_IO_read_ptr
$6 = 0x5555557cce48 "˱N\001\002\017\374\017\020\020"

Как вы можете видеть, он скачет на 6, как и предполагалось.

Теперь проблемный участок:

216         int bread = sizeof(RoughnessReadPoint) * fread(&roughnessBuffer, sizeof(RoughnessReadPoint), 1, ptr);
(gdb) p ptr->_IO_read_ptr
$14 = 0x5555557cce4c "\002\017\374\017\020\020"
(gdb) n
217             totalBytesRead += bread;
(gdb) p ptr->_IO_read_ptr
$15 = 0x5555557cbe52 "\261N\001\002\017\374\017\002\374ͱN\001\002\017\373\017\002\374бN\001\002\017\374\017\002\373ұN\001\002\017\373\016\002\373ձN\001\002\017\373\016\002\373ױN\001\002\017\374\016\002\373ڱN\001\002\017\373\016\002\373ܱN\001\002\017\373\017\002\373߱N\001\002\017\373\017\002\373\342\261N\001\002\017\373\017\002\374\344\261N\001\002\017\373\017\002\373\347\261N\001\002\017\373\017\002\373\351\261N\001\002\017\373\017\002\373\354\261N\001\002\017\373\017\002\373\356\261N\001\002\017\374\016\002\373\361\261N\001\002\017\373\016\002\373\363\261N\001\002\017\374\016\002\373\366\261N\001\002\017\374\016\002\373\370\261N\001\002\017\374\016\002\373\373\261N\001\002\017\374\016\002\373", <incomplete sequence \375>...

Обратите внимание, указатель чтения ушел ОБРАТНО 4086 байт.

Для правильной меры я распечатал, сколько байтов было читайте также здесь ...

(gdb) p bread
$16 = 6

Кто-нибудь знает, что происходит?

Другая информация: Это, очевидно, отладочная сборка, но это происходит при компиляции с -O2 Это также Ubuntu 18.04, скомпилированный с g ++. Файл имеет длину около 130 МБ, и это происходит на 83 МБ в файле

Если я продолжаю читать, файл снова и снова приближается к одной и той же точке, только чтобы упасть назад 4086 байт каждый раз!

1 Ответ

1 голос
/ 02 марта 2020

Как сказали dbu sh и kaylum в комментариях, я должен был использовать ftell вместо использования внутренних переменных в структуре FILE. Моя проблема была с файлом, который я читал - он просто произошел в тот же момент, когда внутренняя переменная перепрыгнула.

...