[cgi] append op 2e regel

Pagina: 1
Acties:

  • rjsomeone
  • Registratie: Juli 2001
  • Laatst online: 20-11-2023

rjsomeone

a.k.a. Tuslsh

Topicstarter
Is het mogelijk, met append en seek te regel toe te voegen op de 2e regel?
met seek kan je een offset instellen, maar die is in bytes en niet in regels..
code:
1
2
3
4
open(FILE,">>$filename") or dienice("Can't open outdata.txt for writing: $!");
seek(FILE, 1, 0);
print FILE "test\n";
close(FILE);

alleen die 1 in seek(FILE, 1, 0); moet dus 1 regel worden ipv 1 byte..

Hier had uw advertentie kunnen staan :).


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Dat hebben we al eens behandeld en de conclusie was dat dit eigenlijk niet mogelijk was.

Wat je wel kan doen, is gewoon de eerste regel uitlezen en vervolgens printen. Ongetestte code:
code:
1
2
3
4
open(FILE,"+<bla");  # openen met read+write access
<FILE>;       # eerste regel inlezen    
print "Regel 2\n";     # tweede regel schrijven
close(FILE);

Denk er trouwens aan dat op deze manier, zodra je naar je bestand schrijft, je waarschijnlijk alle data die er na komt kwijt bent (hoewel ik dat niet 100% zeker weet). In ieder geval is het onmogelijk om de bestaande data 'op te schuiven'. Als dat de bedoeling is, zul je het hele bestand opnieuw moeten schrijven (en dus waarschijnlijk eerst in moeten lezen).

Dat is wel eenvoudig natuurlijk:
code:
1
2
3
open(FILE,"<bla"); @lines=<FILE>; close(FILE);
$lines[1]="Regel 2\n";
open(FILE,">bla"); print @lines; close(FILE);

Verwijderd

altijd leuk als de topicstarter even reageert.

  • rjsomeone
  • Registratie: Juli 2001
  • Laatst online: 20-11-2023

rjsomeone

a.k.a. Tuslsh

Topicstarter
Bedankt soultaker, 't werkt (de laatste methode dus). Alleen ipv $lines[1]="Regel 2\n";
voegt ie een regel in bij mij ipv te overschrijven.
dus:

open(FILE,"<$filename");
@regels=<FILE>;
chop(@regels);
$size=@regels;
close(FILE);

open(FILE,">$filename");
print FILE $regels[0]."\n";
$newline = 'testregel';
print FILE $newline."\n";
for ($i=1;$i<$size;$i++) {
print FILE $regels[$i]."\n";
}
close(FILE);

Hier had uw advertentie kunnen staan :).


  • rjsomeone
  • Registratie: Juli 2001
  • Laatst online: 20-11-2023

rjsomeone

a.k.a. Tuslsh

Topicstarter
Op zondag 21 april 2002 19:13 schreef Foxboy het volgende:
altijd leuk als de topicstarter even reageert.
Mag ik ook eens een dagje weg zijn :)?
Maar ehm.. veel meer dan 'm bedanken kan ik niet of wel?

Hier had uw advertentie kunnen staan :).


Verwijderd

Op zondag 21 april 2002 20:48 schreef rjsomeone het volgende:

[..]

Mag ik ook eens een dagje weg zijn :)?
Maar ehm.. veel meer dan 'm bedanken kan ik niet of wel?
never mind
waz een beetje in een pissed bui.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Op zondag 21 april 2002 20:47 schreef rjsomeone het volgende:
(code zonder code tags)
Code tussen code tags, please!

Het is trouwens jammer dat je nu al je regels eerst gaat choppen, om ze vervolgens weer met newline uit te printen. Dat is natuurlijk zonde van de moeite!

Je kan natuurlijk ook de eerste regel printen door 'm eraf te shiften. Dan krijg je zoiets:
code:
1
2
3
  print shift(@lines);
  print $nieuwe_regel.'\n';
  print @lines;

Dat scheelt een for-lus en is dus waarschijnlijk een stuk efficienter. Als het niet om de tweede regel zou gaan, zou je weer splice kunnen gebruiken.

Verder is je code prima in orde.
Pagina: 1