2016-04-10 25 views
0

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

versucht

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

Antwort

1

Was ist die Definition Ihrer Variablen current_position?

Ihre Verwendung von fseek scheint falsch. Die man-Seite für fseek(3) sagt die Definition lautet:

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

Für Ihren Anwendungsfall muss whence auf eine konstanten SEEK_CUR in stdio.h definiert eingestellt werden.

+0

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 –

+0

Es ist nicht ungewöhnlich, dass nach dem Beheben eines Fehlers Sie einen anderen begegnen. –