底部解决方案
我正在研究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个字节。更新
显然您应该以
r+
模式打开文件,所以我已经对其进行了更新,但它仍在执行相同的操作ip_packets = fopen("ip_packets", "r+");
还尝试了
rb
模式解
我的解决方案是仅循环字节数,然后在每个循环中调用
fgetc()
。不太适合,但可以 最佳答案
变量current_position
的定义是什么?
您使用fseek似乎是错误的。 fseek(3)
的手册页上的定义是:fseek(FILE *stream, long offset, int whence);
对于您的用例,必须将whence
设置为在SEEK_CUR
中定义的常量stdio.h
。
关于c - C:fseek()没有指向定义的字节数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36535882/