fremddatei read and write < Sonstige < Schule < Informatik < Vorhilfe
|
Hallo !!!
in meiner abc.txt steht:
in meiner test1.php:
1: | <?php
| 2: |
| 3: | $handle = fopen ("abc.txt", "r+");
| 4: |
| 5: | while (!feof($handle)) {
| 6: |
| 7: | $buffer = fgets($handle,1024);
| 8: |
| 9: | $count++;
| 10: |
| 11: | if ($buffer==4) {
| 12: | fwrite($handle, "hallo");
| 13: | }
| 14: |
| 15: | if ($count==4) {
| 16: | echo $buffer;
| 17: | }
| 18: |
| 19: | }
| 20: |
| 21: | fclose ($handle);
| 22: |
| 23: | ?>
|
test1.php müsste doch eigentlich ausgeben: "4"
und unbemerkt die "4" in abc.txt durch "hallo" ersetzen.
die ausgabe ist auch 4, aber er schreibt das hallo einfach nirgendwohin ...
Vielen Dank wenn ihr mir sagen könnt warum und was ich machen kann !!!
|
|
|
|
> test1.php müsste doch eigentlich ausgeben: "4"
> und unbemerkt die "4" in abc.txt durch "hallo" ersetzen.
Hallo Bit2_Gosu,
wenn du die Beschreibung der Funktion fgets im Mosterfahndungsbuch http://de.php.net/manual/en/function.fgets.php#AEN46267 liest, stellst du fest, dass diese Funktion außer dem Inhalt der Zeile (bei dir "4") auch das newline-zeichen zurückliefert, das diese Zeile abschließt.
Manchmal liefert es auch das EndOfFile Zeichen zurück.
Jedenfalls muss deine Abrage if ($buffer==4) im Sand verlaufen.
Probier mal provisorisch if ($buffer=="4\n")
Es wäre interessant zu hören, ob's daran liegt.
Gruß Karthagoras
|
|
|
|
|
Hallo Kathagoras!
Leider geht es damit auch net. Aber die Sache ist, auch wenn ich if ($count==4) schreibe statt $buffer==4 schreibt er net hallo in abc.txt ... Das kann doch gar nit wahr sein ... -.-
Was könnte bloß das Problem sein ???
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 15:57 So 27.08.2006 | Autor: | piet.t |
Hallo,
ich hab ja von php keine Ahnung, aber ich hab mal einen kleinen Blick in selfphp geworfen und da bei fwrite folgendes gefunden:
Bedenken Sie, dass die Datei mit "b" geöffnet werden muss, falls Sie ein System
nutzen, welches zwischen Binär- und Textdateien unterscheidet (z.B. Windows).
Kann es das vielleicht sein??
Gruß
piet
|
|
|
|
|
Gute Idde ;) Klappt aber immer noch nicht -.-
Trotzdem Danke !
Hat vielleicht jemand noch eine Idee ??
Normal geht schreiben immer bei mir auch mit w+
ich kapier das einfach nicht ;)
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:38 So 27.08.2006 | Autor: | ardik |
Hi,
also bei mir tut er das (fast) wie Du es erwartest.
Allerdings schreibt er das "hallo" hinter die 4 in die nächste Zeile und überschreibt damit das, was nach der vier kam.
Das ist aber auch das korrekte Verhalten. Der Pointer steht beim Lesen ja schon am Anfang der nächsten Zeile, wenn der Schreib-Befehl kommt, also wird auch dort erst dass "hallo" geschrieben.
Wenn Du nachschaust, ob die abc.txt sich geändert hat, bist Du Dir sicher, nicht noch in die alte unveränderte Datei zu schauen?
Füge doch hinter fclose(); noch die Zeile
readfile('abc.txt');
ein. Der Befehl liest die genannte Datei ein und sendet sie direkt an die Ausgabe.
Außerdem empfehle ich, die abc.txt noch bis ca. zur achten Zeile zu erweitern, damit Du schön siehst, wie das "hallo" nur die entsprechenden Zeichen überschreibt und dahinter der alte Inhalt wieder auftaucht.
Übrigens: Das Problem mit dem Zeilenendezeichen, das wir letztens ja schon hatten (und mit trim() lösten) und das Karthagoras ansprach, ist hier irrelevant. In Deiner Abfrage ($buffer==4) wird die Zeichenkette (der String) $buffer durch den Vergleich mit einer Zahl selbst in eine Zahl umgewandelt. Dabei werden nachfolgende Zeichen, die nicht als Bestandteil der Zahl interpretiert werden können, ignoriert. Also selbst wenn die Zeile "4undStuss" lauten würde, wäre die Bedingung erfüllt und in die nachfolgende Zeile würde das hallo geschrieben.
Wenn Du freilich mit === überprüft hättest, wäre die Abfrage sicherlich falsch, da diese Abfrage ja auch die Übereinstimmung des Types überprüft, die beim Vergleich einer Zeichenkette mit einer Zahl nicht gegeben ist.
Schöne Grüße,
frag gern weiter nach, wenn Du magst.
ardik.
|
|
|
|
|
Echt vielen Dank Ardik für deine Mühe !!
Ich hab auch die Zahlenkette in abc.txt erweitert und gucke nachher nicht die alte abc.txt an. mit read(abc.txt) dran gibt er jedes mal aus:
4123456789 (die 4 ja vom echo $buffer)
Nur leider, schreibt bei mir das Programm das "hallo" einfach nirgendwo hin ;)
Das gibts doch echt nit oder? Hast du das Programm genauso raußkopiert und bei dir gehts?
Woran kann das bloß liegen??
|
|
|
|
|
Die Idee mit den schreibrechten hatte ich leider auch schon -.-
test2.php:
1: | <?php
| 2: |
| 3: | $handle = fopen ("abc.txt", "r+");
| 4: |
| 5: | fwrite($handle, "hallo");
| 6: |
| 7: | readfile("abc.txt");
| 8: |
| 9: | ?> |
beim ersten aufruf gibt er aus:
1 2 3 4 5 6 7 8 9 10 11
beim zweiten aufruf gibt er aus:
hallo 3 4 5 6 7 8 9 10 11
bei test1.php kann ich übrigens so oft aufrufen, wie ich will es schreibt immer:
4 1 2 3 4 5 6 7 8 9 10 11
komisch übrigens doch, dass er bei test2.php nicht gleich die zweite variante ausgibt oder?
auf jeden fall bin ich sehr verzweifelt ;) finde es aber trotzdem toll, dass dir soviel mühe machst !!
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:51 So 27.08.2006 | Autor: | ardik |
Hm, zwischen dem fwrite() und dem readfile() fehlt mir ein fclose().
Die Mühe ist nicht ganz uneigennützig.
Fremde Fehler zu finden hilft ungemein bei der eigenen Verständnisvertiefung und beim gewinnen von Routine...
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:57 So 27.08.2006 | Autor: | Bit2_Gosu |
tjo stimmt , dann kommt das hallo sofort ;)
hast du noch ne idee wen man bei so vertrackten fragen kontaktrieren kann?
(und ach, das ganze hilft dir beim verständnis, machst du beruflich was mit php?)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:05 So 27.08.2006 | Autor: | ardik |
> hast du noch ne idee wen man bei so vertrackten fragen kontaktrieren kann?
Es gibt diverse php-Foren, die ich gerade nicht auf dem Schirm habe (ich bin schrecklich unorganisiert...)
> (und ach, das ganze hilft dir beim verständnis, machst du beruflich was mit php?)
Naja, ich verdiene mein Geld u.a. auch damit, Webseiten zu erstellen und zu pflegen. Da bleiben php und mySQL und Co. nicht aus. Allerdings bin ich bisher nicht so intensiv und ständig mit php beschäftigt, dass ich das alles "im Schlaf" zaubere.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:28 So 27.08.2006 | Autor: | ardik |
Ach so, ich dachte zwischendurch, mit dem fclose() hätte sich auch das Originalproblem geklärt.
(hat's das vielleicht? hattest Du da evtl. den selben Fehler??)
Dann setzte ich die Frage oben mal wieder nicht auf "beantwortet".
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:58 So 27.08.2006 | Autor: | Bit2_Gosu |
nein nein, in test1.php stand und steht von anfang an auch fclose($handle);
die frage ist leider noch nicht beantwortet ;)
ich hab den ganzen kram übrigens mal auf webspace hochgeladen (von dem aus ich auch oft php scripts erfolgreich ausführe) und ausgeführt und oh mein gott:
er läd mayb 9 sek und dann kommt: gar nix... noch nicht mal die
4 1 2 3 4 5 6 7 8 9 10 11 und auch keine errormeldung
wenn ich da test2.php also das andere teil ausführe kommen einige errormeldungen, u.a. permission denied. ok der zugriff wird verweigert, aber warum kommen diese errormeldungen net auch bei test1.php??
wahrscheinlich ist read erlaubt und nur write nicht. und es kommt keine error meldung weil er gar nicht versucht zu schreiben.
d.h. dort habe ich wahrscheinlich im prinizp das selbe problem wie offline..
was zum teufel ist da los ?????
|
|
|
|
|
Hallo ardik, hallo Bit2_Gosu,
> Übrigens: Das Problem mit dem Zeilenendezeichen, das wir
> letztens ja schon hatten (und mit trim() lösten) und das
> Karthagoras ansprach, ist hier irrelevant. In Deiner
> Abfrage ([mm]buffer==4) wird die Zeichenkette (der String) [/mm]buffer
> durch den Vergleich mit einer Zahl selbst in eine Zahl
> umgewandelt. Dabei werden nachfolgende Zeichen, die nicht
> als Bestandteil der Zahl interpretiert werden können,
> ignoriert. Also selbst wenn die Zeile "4undStuss" lauten
> würde, wäre die Bedingung erfüllt und in die nachfolgende
> Zeile würde das hallo geschrieben.
es stimmt schon, dass das Zeilenendezeichen in eurem Beispiel einfach rausfliegt. Da habt Ihr mich erwischt und ich habe 2-3 Tage Zeit gehabt darüber nachzudenken.
Allerdings hat sich in meinem Trotzkopf in diesen 2-3 Tagen die Erkenntnis (Überzeugung, Meinung) festgesetzt, dass es hirnrissig ist, ein Problem der Zeichenkettenverarbeitung so zu programmieren, dass die Nutzlast (die "4") dieser Zeichenkette eher zufällig von unerwünschtem Ballast (Zeilenendezeichen) befreit wird.
Ich halte es deshalb für hirnrissig, weil ich mir Euch an einem Punkt in der Zukunft vorstelle, nachdem Ihr das Problem gelöst und den Algorithmus zu laufen gebracht habt. (Alles läuft und es herrscht prima Sonnenschein.)
Ärger breitet sich allerdings dann aus, wenn man dann nur versucht, die Datei auf
1: | I
| 2: | II
| 3: | III
| 4: | IV
| 5: | V
|
oder
1: | eins
| 2: | zwei
| 3: | drei
| 4: | vier
| 5: | fuenf
|
oder
1: | rot
| 2: | gelb
| 3: | blau
| 4: | gruen
| 5: | schwarz
|
umzustellen.
Gruß Karthagoras
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:07 Do 31.08.2006 | Autor: | ardik |
Hallo Karthagoras,
damit hast Du natürlich völlig recht.
Aus diesen Gründen z.B. trim() zu verwenden, hatte ich schon in einer vorhergehenden Diskussion empfohlen.
Hier ging es (mir) vor allem darum, nebenbei zu erläutern, warum hier funktionierte, was scheinbar nicht hätte funktionieren sollen.
Für sauberes und flexibles Programmieren ist dieses iVorgehen freilich unzweckmäßig.
Schöne Grüße,
ardik
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:20 Mo 11.09.2006 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|