Lösung auf dem BodenC: fseek() nicht zeigt auf die definierte Bytenummer
Ich arbeite an einem IP-Forwarding-Programm. Nach dem Lesen eines Header-Felds verwende ich fseek()
, um den Dateizeiger auf den Anfang des nächsten IP-Header-Felds zu zeigen. Nur habe ich einen aktuellen Positionswert von 20 und eine von 40 versetzt ist, aber wenn ich fseek()
es bleibt bei Byte Nummer 20.en
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);
Diese Drucke:
Header length = 20
Datagram length = 40
Current position = 20
Current position = 60
pos is 20 bytes
Der obigen Code enthält meine Variable Initialisierungen für die fseek()
Funktion. Ich habe versucht, SEEK_CUR
als int whence
Parameter zu verwenden, aber dann wird das Programm nicht beendet. Das Ende der Datei wird nie erreicht, nach nur einer Sekunde bekomme ich pos is 234167456 bytes
und die Datei ist nur 377 Bytes.
UPDATE
Anscheinend sollen Sie die Datei in r+
-Modus öffnen, so habe ich aktualisiert, aber es tut immer noch die gleiche Sache
ip_packets = fopen("ip_packets", "r+");
Auch rb
Modus
LÖSUNG
Meine Lösung war, einfach die Anzahl der Bytes zu wiederholen und fgetc()
innerhalb jeder Schleife aufzurufen. Nicht eine gute Passform, aber es funktioniert
Ich habe vergessen, variable Initialisierungen aufzunehmen - sie wurden hinzugefügt. Ich dachte, ich sollte auch 'SEEK_CUR' verwenden, aber dann erreicht die Datei niemals das Ende. Ich lasse es für eine Sekunde laufen und das ist 'pos ist 234167456 bytes' und die Datei ist nur 377 Bytes. Das Programm beendet nicht –
Es ist nicht ungewöhnlich, dass nach dem Beheben eines Fehlers Sie einen anderen begegnen. –