www.mikrocontroller.net

Forum: PC-Programmierung zwei Pointer auf gleiche Datei


Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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".
h_pointer = o_file;      //Pointerkopie h_pointer auf Originalpointer 
i=search_tag(h_pointer, "TALB");  //Aufruf mit der Pointerkopie h_pointer
for(j=0; j<i; j++)
  c_tags[0][j]=fgetc(h_pointer);
h_pointer = o_file;      //Pointerkopie h_pointer auf Originalpointer o_file zurücksetzen
i=0;

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


Und hier die search_tag:
int search_tag(FILE *h_pointer, char string[3])
{
  int i;
  char c;
  char size[3]={0};
  printf("\n\nStarte bei: %p\n", h_pointer);
  while(c!=EOF)
  {
  c=fgetc(h_pointer);
    if(c==string[0])
    {
      c=fgetc(h_pointer);
      if(c==string[1])
      {
        c=fgetc(h_pointer);
        if(c==string[2])
        {
          c=fgetc(h_pointer);
          if(c==string[3])
          {
            for(i=0;i<4;i++)
            size[i]=fgetc(h_pointer);
            break;
          }
        }
      }
    }
  }
  i=0;

  i=(size[3])+ 256*(size[2]);
  fgetc(h_pointer);
  fgetc(h_pointer);

return i;
}

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht 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()

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder rewind()

Autor: Christoph S. (mixer) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super,

Danke!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.