底部解决方案

我正在研究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/

10-13 03:05