Seek funktion
Sabine G.
- cgi
Hallo
Programmiere gerade in CGI/PERL.
Hab die Frage zwar schon gestern in ähnlicher Weise gestellt, muss aber nochmal fragen.
Ich bekomme das mit der Seek funktion irgendwie nicht auf die reihe.
Wenn ich das so schreibe:
open (infile,"<textfile"); # wenn ich ich das kleiner als (<) Zeichen so ein
#so einfüge, dann liest er nur aus, anders
#functioniert es garnicht
seek (infile,5,0); #Position --> funktioniert auch soweit, wenn ich
#das kleiner als Zeichen einsetze
????????????????? jetzt möchte ich aber gerne, das er an die angegebene Zeigerstelle die von mir gewünschten Daten einfügt, macht er aber nicht.
habe es bis jetzt nur geschaft, das er die Daten am ende einfügt, das möchte ich aber nicht.
Könnt ihr mir da noch mal helfen
Danke
Sabine
Moin!
Programmiere gerade in CGI/PERL.
Du programmierst in _PERL_. CGI ist eine Schnittstelle für alles mögliche, damit kann man nicht programmieren. :)
Hab die Frage zwar schon gestern in ähnlicher Weise gestellt, muss aber nochmal fragen.
Oha, </faq/#Q-11> droht.
Ich bekomme das mit der Seek funktion irgendwie nicht auf die reihe.
Wenn ich das so schreibe:
open (infile,"<textfile"); # wenn ich ich das kleiner als (<) Zeichen so ein
#so einfüge, dann liest er nur aus, anders
#functioniert es garnicht
Dieser Befehl öffnet die angegebene Datei zum _Lesen_. Und zwar ausschließlich zum Lesen, und sonst für nichts. Logischerweise kannst du dann nichts in die Datei schreiben.
Wenn du schreiben willst, mußt du mindestens man die Datei zum Schreiben öffnen, wobei es dummerweise zwei Möglichkeiten gibt: Schreiben und die vorhergehende Datei dabei löschen, oder Schreiben, indem hinten an die Daten angehängt wird.
Von einer Möglichkeit, einen Schreibezeiger irgendwohin zu setzen habe ich noch nichts gehört. Die übliche Vorgehensweise für den Fall, daß Daten an den Anfang oder in die Mitte einer bestehenden Datei geschrieben werden sollen, ist bislang immer gewesen, eine temporäre Datei anzulegen, entsprechend den Wünschen die alte Datei auszulesen und in die neue Datei zu kopieren und dabei an passender Stelle die neuen Daten einzufügen - und am Ende dann die alte Datei zu löschen und die temporäre Datei umzubenennen in den normalen Dateinamen.
seek (infile,5,0); #Position --> funktioniert auch soweit, wenn ich
#das kleiner als Zeichen einsetze
Der Seek-Befehl funktioniert meines Erachtens nur beim Datei_LESEN_, nicht beim Schreiben. Beim Lesen ist er sinnvoll, da man so direkt an eine bestimmte Position springen kann. Beim Schreiben wäre das nicht so sinnvoll, denn es kann eigentlich nur überschrieben werden, was vorher in der Datei stand, aber es kann nicht eingefügt werden. Aus diesem Grunde wird man es wohl unterlassen haben, SEEK fürs Schreiben zu implementieren.
- Sven Rautenberg
Hallo
Und wie mach ich das jetzt am besten?
-----------------------------------------------------------------------
P.S.Was meinst du eigentlich mit?:
Oha, /faq/#Q-11 droht.
Ich will ja niemanden entäuschen, aber so heiß ich nun mal
Allerdings wäre es doch total wurst, ob ich mich nun so oder so nennen würde.
MFG
Sabine
Hallo
Oha, /faq/#Q-11 droht.
Ich will ja niemanden entäuschen, aber so heiß ich nun mal
Allerdings wäre es doch total wurst, ob ich mich nun so oder so nennen würde.
Du musst auch wirklich die 11 lesen, nicht die 12 (er meinte Dein Wiederholungsposting); aber immerhin, Du hast es wirklich gelesen.
Gruss
Thomas
Hallo Sabine,
Und wie mach ich das jetzt am besten?
Das kommt darauf an, was du moechtest. Wenn du etwas in eine Datei einfuegen
willst, wirst du nicht darum herum kommen, eine temporaere Datei zu erstellen:
die alte Datei einlesen, bis du an der Stelle angekommen bist, an der du
einfuegen willst, den Text einfuegen und dann den Rest der alten Datei anhaengen.
Anschliessend die temporaere Datei umbenennen.
Wenn du ueberschreiben moechtest, ist seek() ok.
Gruesse,
CK
Hallo
Und wie mach ich das jetzt am besten?
Ich hab' mir dein unteres Posting (ein Link drauf wäre doch wirklich nicht zuviel verlangt gewesen) durchgelesen:
Obwohl mich Christian davon überzeugt hat, daß SEEK auch beim Schreiben geht, ist es keine Lösung für dich, denn du willst Daten einfügen, sie nicht _überschreiben_. Und nur das ginge mit SEEK.
Also bleibt nur die von mir schon genannte Möglichkeit:
Zu beachten ist, daß du sicherheitshalber auch File-Locking verwenden solltest, sofern eine geringe Wahrscheinlichkeit besteht, daß zwei Leute gleichzeitig ins Gästebuch schreiben werden.
Vielleicht ist es aber geschickter, dein Gästebuch beim Anzeigen rückwärts aus der Datei auszulesen bzw. die Datei vorwärts in ein Array einzulesen und dann rückwärts auszugeben.
- Sven Rautenberg
Hallo Sven,
Dieser Befehl öffnet die angegebene Datei zum _Lesen_. Und zwar
ausschließlich zum Lesen, und sonst für nichts. Logischerweise kannst du
dann nichts in die Datei schreiben.
Richtig. Logisch waere hier der Modus '+<' oder '>>'.
Wenn du schreiben willst, mußt du mindestens man die Datei zum Schreiben
öffnen, wobei es dummerweise zwei Möglichkeiten gibt: Schreiben und die
vorhergehende Datei dabei löschen, oder Schreiben, indem hinten an die
Daten angehängt wird.
Nicht ganz. 'perldoc perlopentut'. Es gibt diverse Lese- und Schreibemodi.
Von einer Möglichkeit, einen Schreibezeiger irgendwohin zu setzen habe ich
noch nichts gehört.
Dann hast du jetzt davon gehoert :)
Die übliche Vorgehensweise für den Fall, daß Daten an den Anfang oder in die
Mitte einer bestehenden Datei geschrieben werden sollen, ist bislang immer
gewesen, eine temporäre Datei anzulegen, entsprechend den Wünschen die alte
Datei auszulesen und in die neue Datei zu kopieren und dabei an passender
Stelle die neuen Daten einzufügen - und am Ende dann die alte Datei zu
löschen und die temporäre Datei umzubenennen in den normalen Dateinamen.
Das hat aber nichts damit zu tun, dass man den Datei-Zeiger im Schreibe-Modus
nicht setzen koennte. Das kann man durchaus. Das liegt nur daran, dass
die Daten dann ueberschrieben werden, mit den neuen. Einen 'Einfuege-Modus'
gibt es nicht.
Der Seek-Befehl funktioniert meines Erachtens nur beim Datei_LESEN_, nicht
beim Schreiben.
Vorher perldoc lesen :)
Natuerlich geht das auch beim schreiben.
Beim Lesen ist er sinnvoll, da man so direkt an eine bestimmte Position
springen kann. Beim Schreiben wäre das nicht so sinnvoll, denn es kann
eigentlich nur überschrieben werden, was vorher in der Datei stand, aber es
kann nicht eingefügt werden. Aus diesem Grunde wird man es wohl unterlassen
haben, SEEK fürs Schreiben zu implementieren.
Sicher ist das sinnvoll. Wenn man z. B. eine Datei mit festen Breiten fuer
Daten-Felder hat. Was meinst du, wie eine binaere Suche in Dateien
umgesetzt wird?
Es ist ueberigens sehr lustig, was passiert, wenn man folgendes macht:
open DAT,'>file';
seek DAT,10737418240,SEEK_SET;
print DAT "filling the hd... :)\n";
close DAT;
Gruesse,
CK