Lesen und Schreiben mit einem file handle O_RDWR geht nicht

Discussion in 'Perl Misc' started by Ulrich Raabe, Jan 25, 2004.

  1. Ulrich Raabe

    Ulrich Raabe Guest

    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;
    Ulrich Raabe, Jan 25, 2004
    #1
    1. Advertising

  2. Ulrich Raabe

    Ulrich Raabe Guest

    Sorry,
    I picked up the wrong newsgroup.

    Bye Raaven

    "Ulrich Raabe" <> schrieb im Newsbeitrag
    news:bv0kic$cpi$05$-online.com...
    > 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;
    >
    >
    Ulrich Raabe, Jan 25, 2004
    #2
    1. Advertising

  3. Ulrich Raabe

    gnari Guest

    "Ulrich Raabe" <> wrote in message
    news:bv0kic$cpi$05$-online.com...
    > 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
    gnari, Jan 25, 2004
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Richard
    Replies:
    0
    Views:
    584
    Richard
    Oct 16, 2003
  2. Johannes Eble
    Replies:
    0
    Views:
    379
    Johannes Eble
    May 25, 2004
  3. Robert Panther
    Replies:
    1
    Views:
    459
    Amedee Van Gasse
    Jun 23, 2005
  4. Dennis Schulz

    struct in datei schreiben

    Dennis Schulz, May 6, 2004, in forum: C Programming
    Replies:
    12
    Views:
    4,128
    Mabden
    May 7, 2004
  5. Michi
    Replies:
    0
    Views:
    69
    Michi
    Jul 14, 2003
Loading...

Share This Page