jammer: Datei auslesen und in selbige schreiben!?

Hi CGI freaks,

Mein Prob ist folgendes:
ich habe die Datei OLDFILE, nun möchte ich aus dieser bestimmte Einträge entfernen und OLDFILE wieder erstellen, ohne das die zu entfernenden Einträge drin sind. Das klappt auch soweit, aber nur wenn ich das Ergebnis in einer neuen Datei (NEWFILE) speichere. Möchte ich das Ergebnis in die selbe Datei schreiben, die ich auch ausgelesen habe ist sie einfach leer. Die Löschoperation funzt, da wenn man NEWFILE benutzt alles klappt.
Wenn ich aber nun OLDFILE auslesen möchte und das Ergebnis auch in OLDFILE speichern will, was muß ich da machen???
danke im voraus

anbei:
Mein Versuch

require "cgi-lib.pl";
&parse_form;

#$new = ">e:/Xitami/webpages/eintrag/eintrag2.txt";
#open (NEWFILE, $new) or die "Datei existiert nicht\n";

$Satz = "";
while (<OLDFILE>)
{
chomp($Satz);
$Satz .= $_;
}
@Ergebnis = split(/ /, $Satz);
$Laenge =$#Ergebnis;

close(OLDFILE);
$old2 = ">e:/Xitami/webpages/eintrag/eintrag.txt";
open (OLDFILE2, $old2) or die "Datei existiert nicht\n";

for ($i=0; $i<$Laenge; $i++)
{
  if ($in{'loeschen'} == $i+1)
   {
    
    $Ergebnis[$i]=substr($Ergebnis[$i], 0, 1) = "  ";
    print OLDFILE2 "$Ergebnis[$i]";

}
   print OLDFILE2 "$Ergebnis[$i]\n";
}

close (OLDFILE);
#close (NEWFILE);

  1. Wenn ich aber nun OLDFILE auslesen möchte und das Ergebnis auch in OLDFILE speichern will, was muß ich da machen???

    Hi,

    Du kannst nie in einer Datei gleichzeitig lesen und schreiben. ALso immer erst open(DAT,"<xxx"); und Close(DAT); und dann erst open(DAT">xxx"); und close(DAT);.
    Soweit ich Deinen Versuch verstanden habe, speicherst Du das gesamte File in eine Variable, um sie dann wieder in eine Datei zu schreiben. Du kannst aber das alte und das neue File gleichzeitig öffnen, zeilenweise von old nach new schreiben(geht recht einfach in einer Schleife), alle beide schließen, und dann mit rename("new","old") die neue Datei mit dem alten Name belegen. Damit ist wieder nur der alte Name zu finden, der Inhalt aber ausgetauscht.

    Chiau Pit

    1. Du kannst nie in einer Datei gleichzeitig lesen und schreiben. ALso immer erst open(DAT,"<xxx"); und Close(DAT); und dann erst open(DAT">xxx"); und close(DAT);.

      Hast Du schon mal "perldoc -f open" gelesen?

      Zitat: "You can put a '+' in front of the '>' or '<' to indicate that
      you want both read and write access to the file;"

      Soweit ich Deinen Versuch verstanden habe, speicherst Du das gesamte File in eine Variable, um sie dann wieder in eine Datei zu schreiben. Du kannst aber das alte und das neue File gleichzeitig öffnen, zeilenweise von old nach new schreiben(geht recht einfach in einer Schleife), alle beide schließen, und dann mit rename("new","old") die neue Datei mit dem alten Name belegen. Damit ist wieder nur der alte Name zu finden, der Inhalt aber ausgetauscht.

      Das geht genau dann schief, wenn zwei Prozesse gleichzeitig eine Datei aendern wollen.

      Besser oben genannte Methode benutzen und das File locken.

      Viele Gruesse,
      Daniel Bradler

  2. Moin Pit,

    Hi CGI freaks,

    Mein Prob ist folgendes:
    ich habe die Datei OLDFILE

    (also eher das Datei-Handle OLDFILE, nehm ich mal an...)

    nun möchte ich aus dieser bestimmte Einträge entfernen und OLDFILE wieder erstellen, ohne das die zu entfernenden Einträge drin sind. Das klappt auch soweit, aber nur wenn ich das Ergebnis in einer neuen Datei (NEWFILE) speichere. Möchte ich das Ergebnis in die selbe Datei schreiben, die ich auch ausgelesen habe ist sie einfach leer.
    Mein Versuch
    ...

    dort lese ich der Reihe nach

    while(<OLDFILE>)  // wurde wohl vorher mal geöffnet?!
      { ... }
      close(OLDFILE);
      open(OLDFILE2, ...);
      ...
      close(OLDFILE);

    zumindest das letzte close kann so nicht stimmen. Kann es sein, daß Du einfach

    close(OLDFILE2);

    schreiben mußt? Probier's damit mal, das wird wohl der Fehler sein...

    Bis dannundwann

    Andreas