Zeilenweise lesen einer Datei

Zeilenweise lesen einer Datei

am 03.04.2008 13:34:14 von Thomas Guettler

Hallo,

Ich möchte von einem Filedescriptor zeilenweise lesen
und jedesmal prüfen, ob das Lesen erfolgreich war. Als
Vorlage diente diese URL:

http://perldoc.perl.org/functions/readline.html

Leider funktioniert das nicht, wenn die letzte Zeile kein
Newline Zeichen am Ende hat:

{{{
open FD, "test.txt" or die $!;
for (;;) {
undef $!;
unless (defined( $line = )) {
die $! if $!;
last; # reached EOF
}
print "line $line";
}
close FD;
}}}

===> perl file.pl
line ...
Bad file descriptor at file.pl line 5, line 2.


Man könnte nun bei jedem Scheifendurchlauf prüfen ob
die Zeichenkette mit \n endet, aber gibt es nicht eine
bessere Lösung?

Thomas

Re: Zeilenweise lesen einer Datei

am 03.04.2008 13:55:25 von Peter Ludikovsky

Thomas Guettler wrote:
> Hallo,
>
> Ich möchte von einem Filedescriptor zeilenweise lesen
> und jedesmal prüfen, ob das Lesen erfolgreich war. Als
> Vorlage diente diese URL:
>
> http://perldoc.perl.org/functions/readline.html
>
> Leider funktioniert das nicht, wenn die letzte Zeile kein
> Newline Zeichen am Ende hat:
>
> {{{
> open FD, "test.txt" or die $!;
> for (;;) {
> undef $!;
> unless (defined( $line = )) {
> die $! if $!;
> last; # reached EOF
> }
> print "line $line";
> }
> close FD;
> }}}
>
> ===> perl file.pl
> line ...
> Bad file descriptor at file.pl line 5, line 2.
>
>
> Man könnte nun bei jedem Scheifendurchlauf prüfen ob
> die Zeichenkette mit \n endet, aber gibt es nicht eine
> bessere Lösung?
>
> Thomas

wäre es nicht einfacher so:

open FD,"test.txt" or die $!;
while($line = ){
#whatever
}

hth
/peter

Re: Zeilenweise lesen einer Datei

am 03.04.2008 14:11:00 von Michael Bernhard

Hi Thomas,

> Man könnte nun bei jedem Scheifendurchlauf prüfen ob
> die Zeichenkette mit \n endet, aber gibt es nicht eine
> bessere Lösung?

# perl -pe '' blablub.txt ;)


aka


# perl -ne ' print $_ ' blablub.txt



aka

#!/usr/bin/perl
while (<>) {
print $_;
}




VG



ciao
bemi

Re: Zeilenweise lesen einer Datei

am 03.04.2008 15:12:18 von Frank Seitz

Thomas Guettler wrote:
>
> Ich möchte von einem Filedescriptor zeilenweise lesen
> und jedesmal prüfen, ob das Lesen erfolgreich war.

Gibt es einen bestimmten Grund für diese akribische Prüfung?
Normalerweise programmiert niemand in Perl das Lesen
aus einer Datei so (wohl in der Annahme, dass das
sowieso nicht fehlschlägt).

> ===> perl file.pl
> line ...
> Bad file descriptor at file.pl line 5, line 2.

Unter Perl 5.8.8 funktioniert der Code,
nur leider nicht unter 5.10.0.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Zeilenweise lesen einer Datei

am 04.04.2008 15:07:05 von Thomas Guettler

Frank Seitz schrieb:
> Thomas Guettler wrote:
>> Ich möchte von einem Filedescriptor zeilenweise lesen
>> und jedesmal prüfen, ob das Lesen erfolgreich war.
>
> Gibt es einen bestimmten Grund für diese akribische Prüfung?
> Normalerweise programmiert niemand in Perl das Lesen
> aus einer Datei so (wohl in der Annahme, dass das
> sowieso nicht fehlschlägt).

Ich möchte es eben wissen, ob ein IO-Fehler aufgetreten ist, oder
nicht.

Und $! nur am Ende prüfen geht nicht, weil zwischendurch
Routinen gerufen werden, die $! ggf. verändern ....

Thomas



--
Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de

Re: Zeilenweise lesen einer Datei

am 06.04.2008 13:21:25 von ichhassesp

"Thomas Guettler" schrieb im Newsbeitrag news:65mnfpF2ghmh4U1@mid.individual.net...
> Frank Seitz schrieb:
>> Thomas Guettler wrote:
>>> Ich möchte von einem Filedescriptor zeilenweise lesen
>>> und jedesmal prüfen, ob das Lesen erfolgreich war.
>>
>> Gibt es einen bestimmten Grund für diese akribische Prüfung?
>> Normalerweise programmiert niemand in Perl das Lesen
>> aus einer Datei so (wohl in der Annahme, dass das
>> sowieso nicht fehlschlägt).
>
> Ich möchte es eben wissen, ob ein IO-Fehler aufgetreten ist, oder
> nicht.
>
> Und $! nur am Ende prüfen geht nicht, weil zwischendurch
> Routinen gerufen werden, die $! ggf. verändern ....

Probier doch mal "local $!;" am Anfang jeder dieser Routinen. Das sollte den alten Wert beim Rücksprung wieder
herstellen.

Klaus

Re: Zeilenweise lesen einer Datei

am 06.04.2008 13:36:21 von Frank Seitz

Thomas Guettler wrote:
> Frank Seitz schrieb:

>>>Ich möchte von einem Filedescriptor zeilenweise lesen
>>>und jedesmal prüfen, ob das Lesen erfolgreich war.
>>
>>Gibt es einen bestimmten Grund für diese akribische Prüfung?
>>Normalerweise programmiert niemand in Perl das Lesen
>>aus einer Datei so (wohl in der Annahme, dass das
>>sowieso nicht fehlschlägt).
>
> Ich möchte es eben wissen, ob ein IO-Fehler aufgetreten ist, oder
> nicht.

Das ist sehr gut und vernünftig gedacht. Beim Lesen aus
einer Datei kannst du dir diese Prüfung aber guten
Gewissens schenken, und so coden:

while () {
# irgendwas mit $_ machen
}

Das machen alle so.

> Und $! nur am Ende prüfen geht nicht, weil zwischendurch
> Routinen gerufen werden, die $! ggf. verändern ....

Ist klar. Wie ich schon schrieb ist das Ganze
ein Problem von Perl 5.10.0, dort wird auf der Suche
nach dem letzten Zeilentrenner, wenn dieser nicht
vorhanden ist, über das Ende der Datei hinausgelesen
und $! irrtümlich gesetzt.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Zeilenweise lesen einer Datei

am 06.04.2008 13:58:17 von ichhassesp

"Frank Seitz" schrieb im Newsbeitrag news:65rqtnF2i16etU2@mid.individual.net...
> Thomas Guettler wrote:
>> Frank Seitz schrieb:
>
>>>>Ich möchte von einem Filedescriptor zeilenweise lesen
>>>>und jedesmal prüfen, ob das Lesen erfolgreich war.
>>>
>>>Gibt es einen bestimmten Grund für diese akribische Prüfung?
>>>Normalerweise programmiert niemand in Perl das Lesen
>>>aus einer Datei so (wohl in der Annahme, dass das
>>>sowieso nicht fehlschlägt).
>>
>> Ich möchte es eben wissen, ob ein IO-Fehler aufgetreten ist, oder
>> nicht.
>
> Das ist sehr gut und vernünftig gedacht. Beim Lesen aus
> einer Datei kannst du dir diese Prüfung aber guten
> Gewissens schenken .....

Nicht unbedingt Netzwerkverbindungen können unterbrochen werden, ein USB-Stick abgezogen. Es soll auch schon Kratzer auf
CDs gegeben haben. Ich habe vor langer Zeit mal gelernt
"If anything in your program can go wrong, it will".

>
> Das machen alle so.

Ich auch. Das ist aber kein Argument.

Gruß

Klaus

--
Persönliche Antwort bitte nur an
KWittrockweb.de

Re: Zeilenweise lesen einer Datei

am 06.04.2008 14:47:17 von Frank Seitz

K. Wittrock wrote:
> "Frank Seitz" schrieb im Newsbeitrag news:65rqtnF2i16etU2@mid.individual.net...
>>
>>Das ist sehr gut und vernünftig gedacht. Beim Lesen aus
>>einer Datei kannst du dir diese Prüfung aber guten
>>Gewissens schenken .....
>
> Nicht unbedingt Netzwerkverbindungen können unterbrochen werden,
> ein USB-Stick abgezogen. Es soll auch schon Kratzer auf
> CDs gegeben haben. Ich habe vor langer Zeit mal gelernt
> "If anything in your program can go wrong, it will".

Wohl wahr.

>>Das machen alle so.
>
> Ich auch. Das ist aber kein Argument.

Ja. Nur leider weiß ich nicht, wie man es ohne
viel Gehampel sauber programmiert.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: Zeilenweise lesen einer Datei

am 07.04.2008 17:14:03 von ichhassesp

"Frank Seitz" schrieb im Newsbeitrag news:65rv2nF2i16etU4@mid.individual.net...
> K. Wittrock wrote:
>> "Frank Seitz" schrieb im Newsbeitrag news:65rqtnF2i16etU2@mid.individual.net...
>>>
>>>Das ist sehr gut und vernünftig gedacht. Beim Lesen aus
>>>einer Datei kannst du dir diese Prüfung aber guten
>>>Gewissens schenken .....
>>
>> Nicht unbedingt Netzwerkverbindungen können unterbrochen werden,
>> ein USB-Stick abgezogen. Es soll auch schon Kratzer auf
>> CDs gegeben haben. Ich habe vor langer Zeit mal gelernt
>> "If anything in your program can go wrong, it will".
>
> Wohl wahr.
>
>>>Das machen alle so.
>>
>> Ich auch. Das ist aber kein Argument.
>
> Ja. Nur leider weiß ich nicht, wie man es ohne
> viel Gehampel sauber programmiert.

Schön wäre es, wenn man einen Error-Handler definieren könnte. Oder eine Funktion ioerr() analog zu eof(). Den
Perl-Entwicklern wird die Arbeit schon nicht ausgehen.

Das ist vielleicht eine Idee (nicht getestet):
while (<>) {
iseof = eof();
... # tue was mit $_
}
unless (iseof) {die "Lesefehler\n"}

Gruß

Klaus

--
Persönliche Antwort bitte nur an
KWittrockweb.de

Re: Zeilenweise lesen einer Datei

am 08.04.2008 19:37:50 von hjp-usenet2

On 2008-04-03 13:12, Frank Seitz wrote:
> Thomas Guettler wrote:
>> Ich möchte von einem Filedescriptor zeilenweise lesen
>> und jedesmal prüfen, ob das Lesen erfolgreich war.
[...]
>> ===> perl file.pl
>> line ...
>> Bad file descriptor at file.pl line 5, line 2.
>
> Unter Perl 5.8.8 funktioniert der Code,
> nur leider nicht unter 5.10.0.

Ich sehe da keinen Unterschied zwischen 5.8.8 und 5.10.0. Beide geben
bei mir beim Input "foo\nbar" aus:

line foo
Bad file descriptor at foo line 10, line 2.
line bar

"line bar" (ohne newline am Ende) wird erst nach dem die ausgegeben,
weil STDOUT zeilengebuffert ist.

hp

Re: Zeilenweise lesen einer Datei

am 08.04.2008 20:01:08 von Frank Seitz

Peter J. Holzer wrote:
> On 2008-04-03 13:12, Frank Seitz wrote:
>>Thomas Guettler wrote:
>>>
>>>===> perl file.pl
>>>line ...
>>>Bad file descriptor at file.pl line 5, line 2.
>>
>>Unter Perl 5.8.8 funktioniert der Code,
>>nur leider nicht unter 5.10.0.
>
> Ich sehe da keinen Unterschied zwischen 5.8.8 und 5.10.0. Beide geben
> bei mir beim Input "foo\nbar" aus:
>
> line foo
> Bad file descriptor at foo line 10, line 2.
> line bar
>
> "line bar" (ohne newline am Ende) wird erst nach dem die ausgegeben,
> weil STDOUT zeilengebuffert ist.

Das ist bei mir anders.
Die Warnung bekomme ich nur unter 5.10.0, unter 5.8.8 geht's.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel