gpt4 book ai didi

C: fseek() 未指向定义的字节数

转载 作者:行者123 更新时间:2023-11-30 15:09:43 24 4
gpt4 key购买 nike

底部解决方案

我正在开发一个 IP 转发程序。读取一个 header 字段后,我使用 fseek() 将文件指针指向下一个 IP header 字段的开头。只是,我的当前位置值为 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 wherece);

对于您的用例,whence 必须设置为 stdio.h 中定义的常量 SEEK_CUR

关于C: fseek() 未指向定义的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36535882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com