Forum: PC-Programmierung zwei Pointer auf gleiche Datei


von Christoph S. (mixer) Benutzerseite


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

von Klaus W. (mfgkw)


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.

von Christoph S. (mixer) Benutzerseite


Lesenswert?

Hallo,

Danke für deine schnelle Antwort!
Jetzt könntest du mir noch verraten wie ich den Dateizeiger auf den 
Anfang setze;-)

MFG Mixer

von Gerry E. (micky01)


Lesenswert?

Mixer S. schrieb:
> Hallo,
>
> Danke für deine schnelle Antwort!
> Jetzt könntest du mir noch verraten wie ich den Dateizeiger auf den
> Anfang setze;-)
>
> MFG Mixer

fseek()

von Klaus W. (mfgkw)


Lesenswert?

oder rewind()

von Christoph S. (mixer) Benutzerseite


Lesenswert?

Super,

Danke!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.