2016-04-10 11 views
0

РЕШЕНИЕ НА НИЖНЕЙC: FSEEK() не указывает на определенное число байт

Я работаю над программой IP пересылки. После чтения одного поля заголовка я использую fseek(), чтобы указать указатель файла на начало следующего заголовка IP-заголовка. Только у меня есть текущее значение положения 20 и смещение 40, но когда я fseek() он остается под номером 20. Байт

struct line { 
    unsigned char a; 
    unsigned char b; 
    unsigned char c; 
    unsigned char d; 
}; 

struct line l1; 

long datagram_length = 0; 
int current_position = 0; 
ip_packets = fopen("ip_packets", "r+"); 

fread(&l1, 4, 1, ip_packets); 
header_length = l1.a & 0x0f; 
header_length *= 4; 
printf("Header length = %u\n", header_length); 

datagram_length = l1.c * 256 + l1.d; 
printf("Datagram length = %d\n", datagram_length); 
printf("Current position = %d\n", current_position); 
current_position += header_length; 

fseek(ip_packets, datagram_length, current_position); 
current_position += datagram_length; 
printf("Current position = %d\n", current_position); 

long pos; 
pos = ftell(ip_packets); 
printf("pos is %ld bytes\n", pos); 

Печатается:

Header length = 20 
Datagram length = 40 
Current position = 20 
Current position = 60 
pos is 20 bytes 

Код выше включает в мою переменную инициализации для функции fseek(). Я пробовал использовать SEEK_CUR как параметр int whence, но тогда программа не заканчивается. Конец файла никогда не был достигнут, после запуска всего лишь секунду я получаю pos is 234167456 bytes, и файл составляет всего 377 байт.

UPDATE

Видимо, вы должны открыть файл в режиме r+, поэтому я обновил, но он по-прежнему делает то же самое

ip_packets = fopen("ip_packets", "r+"); 

Также пытался rb режим

РЕШЕНИЕ

Мое решение состояло в том, чтобы просто заколеровать количество байтов и вызвать fgetc() внутри каждого цикла. Не подходит, но он работает

ответ

1

Что такое определение вашей переменной current_position?

Ваше использование fseek кажется неправильным. Страница человек для fseek(3) говорит определение:

fseek(FILE *stream, long offset, int whence);

Для вашего случая использования whence должен быть установлен на постоянной SEEK_CUR, определенной в stdio.h.

+0

Я забыл включать переменные инициализации - они были добавлены. Я думал, что должен использовать 'SEEK_CUR', но тогда файл никогда не доходит до конца. Я разрешаю ему работать в течение секунды, а полученный 'pos - 234167456 байт', а файл - всего 377 байт. Программа не заканчивается –

+0

Это не редкость, что после исправления одной ошибки вы сталкиваетесь с другой. –

 Смежные вопросы

  • Нет связанных вопросов^_^