zwei Pointer auf gleiche Datei

Persönliche Seite #1478938
Lesenswert?

Hallo,

Ich hab mit fopen eine Datei geöffnet und so einen Pointer der auf die 
Anfangsadresse zeigt. Der nennt sich "o_file"

Jetzt möchte ich einen "Hilfspointer" machen, der zunächst auch auf die 
Anfangsadresse gesetzt wird. Dieser kann dann beliebig die Datei 
durchlaufen und wenn ich ihn wieder am Anfang möchte dann kann ich ihn 
ja wieder mit dem Datei-Pointer laden oder?

Hier mal ein paar Codeschnipsel von mir, wo das nicht so funktioniert 
wie ich das meine:
Der Block wird mehrmals so ausgeführt, jeweils mit einem anderen "Tag".
1
h_pointer = o_file;      //Pointerkopie h_pointer auf Originalpointer 
2
i=search_tag(h_pointer, "TALB");  //Aufruf mit der Pointerkopie h_pointer
3
for(j=0; j<i; j++)
4
  c_tags[0][j]=fgetc(h_pointer);
5
h_pointer = o_file;      //Pointerkopie h_pointer auf Originalpointer o_file zurücksetzen
6
i=0;
7

8
//Zweites mal, ab hier klappts meistens nicht mehr
9
i=search_tag(h_pointer, "TPE1");
10
for(j=0;j<i;j++)
11
  c_tags[1][j]=fgetc(h_pointer);
12
h_pointer = o_file;
13
i=0;


Und hier die search_tag:
1
int search_tag(FILE *h_pointer, char string[3])
2
{
3
  int i;
4
  char c;
5
  char size[3]={0};
6
  printf("\n\nStarte bei: %p\n", h_pointer);
7
  while(c!=EOF)
8
  {
9
  c=fgetc(h_pointer);
10
    if(c==string[0])
11
    {
12
      c=fgetc(h_pointer);
13
      if(c==string[1])
14
      {
15
        c=fgetc(h_pointer);
16
        if(c==string[2])
17
        {
18
          c=fgetc(h_pointer);
19
          if(c==string[3])
20
          {
21
            for(i=0;i<4;i++)
22
            size[i]=fgetc(h_pointer);
23
            break;
24
          }
25
        }
26
      }
27
    }
28
  }
29
  i=0;
30

31
  i=(size[3])+ 256*(size[2]);
32
  fgetc(h_pointer);
33
  fgetc(h_pointer);
34

35
return i;
36
}

Beim ersten mal Aufrufen der Funktion findet er den Tag in der Datei 
noch problemlos, manchmal auch beim zweiten Mal (hängt wohl davon ab wo 
der Tag in der Datei ist!

Allerdings sollte der "suchpointer" h_pointer ja immer von Anfang an 
durch die Datei laufen und so immer die ganze Datei durchsuchen!

Ist hald sehr verwunderlich, dass das für den ersten Aufruf so geht, und 
für die nächsten nicht mehr!!

Hat jemand einen Rat für mich??
MFG Mixer
#1478965
Lesenswert?

Ein FILE* ist kein Zeiger in die Datei, sondern ein Zeiger
auf eine struct, in der die Verwaltungsinformationen zum Stream
liegen.
Wieviele Zeiger man auf diese struct richtet, ist ihr egal; ebenso
welchen von den mehreren Zeigern man gerade benutzt.

Jeder Stream hat eine aktuelle Position. Egal über welchen
der beiden Zeiger du in die Datei gehst, ist es dieselbe Position.
Mit der ersten Suche verstellst du diese aktuelle Postion nach hinten.
Egal welchen Zeiger du nimmst, wird die zweite Suche an der bisher
erreichten Stelle starten.

Lösung: nach der ersten Suche die Datei an den Anfang setzen.

Ansonsten kannst du dir den zweiten Zeiger sparen, er macht nichts
anderes als der erste.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren