Lesen und Schreiben mit einem file handle O_RDWR geht nicht

U

Ulrich Raabe

Hallo zusammen,
ich möchte eine Datei ändern. Im Beispiel unten ist es das Verdoppeln des
Fileinhaltes. Wenn ich für das Lesen und das Schreiben jeweils ein eigenes
file handle object erzeuge und jeweils nach dem Lesen und Schreiben direkt
schließe funktioniert es.
Nun gibt es ja auch die Option O_RDWR beim Instanziieren des file handle
object. Wenn ich nun damit arbeite, so wird die Datei nicht verändert -
ersichtlich am Zeitstempel des file. Wenn ich mit den Methoden setpos und
truncate arbeite (siehe unten) dann wird das file verändert und hat die
Länge 0 Byte. In der shell wird in beiden Fällen die Ausgabe von $content so
ausgegben wie erwartet, d.h. der verdoppelte Text des ursprünglichen file.
Die Sache mit setpos und truncate hatte ich mal gehört, dass man das
bräuchte, ich weiss aber nicht mehr warum.
Zu dem Thema "Lesen und Schreiben mit demselben file handle" habe ich in der
online Dokumentation nichts gefunden, was mir meine Frage beantwortet.
Vielleicht habe ich auch an denfalschen Stellengesucht (module filehandle,
perlfunc, IO::Handle).

Natürlich kann ich mit 2 file handles arbeiten. Aber wenn der perl
Interpreter die Option O_RDWR anbietet, so sollte es doch einen Weg geben,
dass dies auch genutzt werden kann.

Noch ein Wort zu meiner Umgebung:
Windows 98;
This is perl, v5.6.1 built for MSWin32-x86-multi-thread Binary build 635
provided by ActiveState Corp.

Über eine Antwort, die das Verhalten erklärt und eine Korrektur des Codes
würde mich sehr freuen.

Servus Raaven


Hier der Text der Ausgansdatei:


This is a test file with 3 lines.
This is the second line.
This is the final line.


Hier die Ausgabe am Prompt:


E:\_web\Perl>perl -w test_file_in_out.pl
This is a test file with 3 lines.
This is the second line.
This is the final line.This is a test file with 3 lines.
This is the second line.
This is the final line.


Hier der Code:

#!/usr/bin/perl -w
BEGIN {
;
}
use strict;
use warnings;
use diagnostics;
use FileHandle;
my $sourceAndTargetPath = "e:/_web/perl/inout/";
my $fileName = "test.txt";
my $fh = FileHandle->new( $sourceAndTargetPath . $fileName, O_RDWR );
unless ( $fh ) {
print( "Error while get file $fileName: $!.\n" );
return( 0 );
}
my $contents = join( "", $fh->getlines() );
$contents = $contents . $contents;
print( $contents );
$fh->setpos( 0 );
$fh->truncate( 0 );
$fh->print( $contents );
$fh->close();
exit( 0 );
END {
;
}
1;
 
G

gnari

Ulrich Raabe said:
Hallo zusammen,
[snip rest of german]

google translation starts:
Hello together, I would like to change a file. In the example down it is
doubling file contents.

the rest is kind of cryptic, but the code at the end is not.

[snip data that seems to double]
Hier der Code:
...
my $contents = join( "", $fh->getlines() );
ok. (3 lines in example)
$contents = $contents . $contents;
now 6 lines
print( $contents );
6 lines printed to STDOUT
$fh->setpos( 0 );
$fh->truncate( 0 );
file truncated
$fh->print( $contents );
6 lines printed to file
is that not what you got?

did i misunderstand the problem ?

gnari
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top