BaselAla Ответов: 3

Чтение файлов fread и fseek


я использую fread и fseek для чтения некоторого файла байт за байтом, но со следующим кодом он читает только первые семь байтов.
как я могу позволить ему прочитать 34 байта?

Что я уже пробовал:

static FILE *fp;

статический int u32FilePointer=35;
for(i = 0; i < 5; i++)
       {
         fseek(fp, u32FilePointer, SEEK_SET);
         u16BytesRead = fread(u8Buffer, 1, 7, fp);
         printf("u32FilePointer : %lu\n" ,u32FilePointer);

3 Ответов

Рейтинг:
5

Jochen Arndt

Вы используете fseek() внутри цикла так, чтобы положение файла всегда устанавливалось в одно и то же положение перед чтением. Это приводит к чтению одних и тех же данных 5 раз.

Вы также должны обновить позицию поиска:

for(i = 0; i < 5; i++)
{
    fseek(fp, u32FilePointer, SEEK_SET);
    u16BytesRead = fread(u8Buffer, 1, 7, fp);
    // The read updates the internal position of the file pointer
    // If we want to track the position we have to do it also for our variable
    u32FilePointer += u16BytesRead;
    // Or use ftell() to get the internal position
    //u32FilePointer = ftell(fp);
    printf("u32FilePointer : %lu\n" ,u32FilePointer);
}
Когда чтение всегда должно продолжаться после последнего считывания данных, вы также можете переместить seek() из петли:
fseek(fp, u32FilePointer, SEEK_SET);
for(i = 0; i < 5; i++)
{
    u16BytesRead = fread(u8Buffer, 1, 7, fp);
    printf("u32FilePointer : %lu\n", ftell(fp));
}


BaselAla

теперь это ясно , и я вам очень благодарен

Рейтинг:
18

User 7429338

Ваш вопрос мне не совсем понятен, но ваш код делает следующее:

Петли 5 раз:
fseek с SEEK_SETsets устанавливает позицию файла на 35 с самого начала файла.
Фрейд считывает 7 байт с этой позиции.

Если вы намерены прочитать первые 35 байт, вы можете просто сделать это:

fread(u8Buffer, 1, 35, fp);


Это поможет, если вы укажете, сколько байтов вы хотите прочитать из какой позиции в файле.


Рейтинг:
1

Patrice T

Вы уже задавали в основном один и тот же вопрос:
Возврат функции fread[^]
А как насчет чтения документации fread ?


BaselAla

я сожалею об этом , но когда я это оправдываю, я нахожу некоторые странные вещи.
спасибо (: