Zeilenumbruch in eine *.txt-Datei schreiben
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anfang
ausgabe
browser
code
datei
editor
ende
fehler
hinweis
historie
history
level
modus
nutzen
problem
programm
setzen
url
windows
zeile
-
Hallo zusammen!
Ich habe ein Problem und komme nicht weiter. Es funktionierte vor ein paar Tagen fehlerlos, aber nun habe ich es anscheinend kaputt bekommen:
Ich möchte in einer Textdatei eine Art Historie erstellen. Dort soll dokumentiert werden, was der Benutzer wann erreicht hat. Jeder Eintrag soll eine eigene Zeile haben und aus Datum und Text bestehen. Ich lese dann zeilenweise aus, trenne an der Stelle "#%" und gebe es dann aus. Dafür wollte ich nun eine Funktion schreiben und dabei habe ich den Fehler gemerkt: es werden keine Zeilenumbrüche mehr gemacht und alles steht nur noch in einer einzelnen Zeile. Inzwischen läuft es bei den bereits getesteten Schreibzugriffen auch nicht mehr.
Die Historien-Datei soll wie folgt aussehen:
22.11.2013#%Als 6. Mitglied angemeldet.
24.11.2013#%Das nächste Level erreicht.
30.11.2013#%Einen Orden verdient.
Dafür hatte ich z. B. diesen einfachen Code in einer PHP-Datei:
$path = "data/" . $idfull . "_history.txt"; $history = fopen($path, "ab"); $content = "\n" . date("d.m.Y") . "#%Das nächste Level erreicht."; fwrite($history, $content); fclose($history);
Die PHP-Datei liegt im Hauptordner und die Historien-Txt (z. B. "006_history.txt") im untergeordneten Order "data". Durch das "a"-Flag sollte der neue Inhalt angehängt werden und das "b" sollte den Zeilenumbruch mit "\n" systemübergreifend gewährleisten. Jetzt wird es nicht mehr übernommen.
Dazu habe ich bei tutorials.de den Hinweis gefunden, dass es mit dem Modus des Programms zu tun hat.Ich habe in einem Modus meines Programms nicht in eine Datei geschrieben, sondern auf stdout. Den Modus hab ich seit Wochen benutzt und irgenwann hab ich angefangen, die Ausgaben mit "./test.exe > log.txt" umzuleiten. Und bei dem Umleiten wurde aus \n wieder \r\n und aus \r\n wurde \r\r\n.
Was genau das nun bedeutet und wie ich es bei mir verstellt haben könnte, weiß ich nicht...
Habe den Modus gewechselt, direkt in eine Datei geschrieben und alles läuft wunderbar.
Es wäre toll, wenn ihr mir helfen könntet, meine Einträge wieder in einer neuen Zeile einzutragen, damit ich diesen Bereich wieder abhaken kann...
Vielen lieben Dank schon einmal für alle Hinweise!
Grüße
things -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo,
was genau funktioniert nicht? "Kaputt bekommen", ist nicht sehr spezifisch
Werden z.B. Zeilen durcheinandergeworfen?
--> locking Problem untersuchen: Mehrere User schreiben gleichzeitig in die selbe Datei.
Werden z.B. Zeilen nicht übernommen?
--> flushing Probleme untersuchen (manchmal muss man explizit den Puffer flushen oder einen ungepufferten Modus aktivieren).
Edit: Wird gar nichts mehr geschrieben?
--> Zugriffsrechte, Logfiles, Plattenkapazität prüfen.
Ich würde das "\n" gewohnheitsgemäß lieber ans Ende denn an den Anfang der Zeile setzen.
Es gibt z.B. Programme, die erkennen so die letzte Zeile nicht.
Das hat auch den Vorteil, dass beim Zeilengepufferten schreiben die ganze Zeile nach dem "\n" rausgeht.
HTH
Beitrag zuletzt geändert: 24.11.2013 21:03:58 von perlbotics -
Hi perlbotics,
ich hätte es vielleicht deutlicher schreiben sollen statt nur "es werden keine Zeilenumbrüche mehr gemacht" im Fließtext zu schreiben ^^"
Meine Dateien sehen nun so aus:
22.11.2013#%Als 6. Mitglied angemeldet.24.11.2013#%Das nächste Level erreicht.30.11.2013#%Einen Orden verdient.
Jede Zeile wird angehängt, aber das "\n" wird nicht gesetzt. Als ich probehalber in eine nicht vorhandene Datei "\n foo \n" geschrieben habe, wurde die Datei erstellt und 2 Zeilen gesetz:
foo
~~~ Leerzeile ~~~
Wenn ich den selben Text in die nun vorhandene Datei schreibe steht dort:
foo foo
~~~ Leerzeile ~~~
Warum du nun das "\n" ans Ende setzen möchtest habe ich nicht verstanden. Ich erstelle beim Anmelden die Datei und weiß, dass es immer eine Zeile davor gibt. Mit einem "\n" am Ende bekomme ich u. U. eine Zeile am Ende, die eher stört und für mich nach Fehler riecht - darum hab ichs nun immer am Anfang... :/
Was du über flushing und locking und puffern sagst, verstehe ich leider auch nicht ^^" Tut mir leid, ich bin noch nicht so bewandert...
Grüße
things -
Hallo things,
Warum du nun das "\n" ans Ende setzen möchtest habe ich nicht verstanden. Ich erstelle beim Anmelden die Datei und weiß, dass es immer eine Zeile davor gibt. Mit einem "\n" am Ende bekomme ich u. U. eine Zeile am Ende, die eher stört und für mich nach Fehler riecht - darum hab ichs nun immer am Anfang... :/
Was du über flushing und locking und puffern sagst, verstehe ich leider auch nicht ^^" Tut mir leid, ich bin noch nicht so bewandert...
Ich bin mit PHP nicht sehr vertraut, aber die Prinzipien sind fast überall die selben.
Bei der Zeilenpufferung wird die aktuelle Zeile im Speicher gepuffert und erst wenn das "\n" kommt, wird die Zeile auf das Speichermedium (Platte) übertragen (flush buffer). Das passiert normalerweise auch beim schließen der Datei.
Daher sollte das was Du machst, eigentlich funktionierten.
"File Locking" muss man durchführen, wenn mehrere Nutzer gleichzeitig in eine Datei schreiben wollen. Es darf immer nur einer gleichzeitig schreiben, weil es sonst passieren könnte, das Daten überschrieben werden oder die Reihenfolge nicht wie gewünscht ist.
Dein Experiment hat ja gezeigt, dass es mit "\n foo \n" klappt - eigentlich ein Widerspruch.
Könnte es sein, dass Dein Editor in einem Modus ist, der "\r\n" als Zeilenende-Kennung benötigt?
Zeigt Dein Editor die Zeilen ordentlich an, wenn Du "\n" (Unix) durch "\r\n" (Windows) ersetzt?
Wie sieht ein Hexdump der Datei aus? Stehen dort wo die "\n" stehen sollte "0A"s?
Viel Erfolg.
-
Es wäre auf jeden Fall interessant zu wissen, ob die Zeilen umbrüche wirklich nicht vorhanden sind,
oder du einen Darstellungsfehler hast.
womit öffnest du die Datei?
bedenke das der Server mit einem Unix System läuft du wahrscheinlich (statistisch zu 80%) ein Windows System verwendest.
solltest du die Datei bei dir lokal mit dem Script ansprechen
daher der Mode 'at' die bessere Wahl.
die Leerzeile am ende ist nur dann eine Fehlerquelle, wenn du das zulässt.
prüfe doch vorm verarbeiten, ob dein delimiter vorhanden ist.
Beitrag zuletzt geändert: 25.11.2013 1:11:59 von webdave -
Hallo,
ich danke euch vielmals, dass ihr mir helft!
Ich verwende Windows Vista (gab nur das als ich einen neuen Rechner brauchte ^^") und öffne die Dateien mit dem Editor. Das erschien mir sinnvoll. Dort habe ich die Dateien auch mal mit und mal ohne Zeilenumbruch anzeigen lassen und da gab es keinen Unterschied.
Ich bin eben sehr verwirrt, dass es mal ging und jetzt nicht mehr. Um der Zeilenumbruch-Hackerei zu entgehen schreibe ich doch extra binär "\n" als Zeilenumbruch. Das sollte dann doch überall gehen, oder!?
Inzwischen habe ich mal die Dateien im Browser geöffnet (FF): Dort sind Zeilenumbrüche zu sehen. Außerdem ist in den Dateien das zu sehen:
20.01.2013#%Große Taten vollbracht.
In der Ausgabe und im Editor sind die Umlaute zu lesen. Das hat mit dem binär-Kram zu tun, oder?
Die Zeilenumbrüche sind weiterhin nicht im Editor zu finden. Ausgabe im Browser und die Anzahl der Zeilen, die ich mit file() bekomme, sind auch richtig.
Nur wenn ich mir die Datei im Editor (jetzt) ansehen möchte, ist es falsch... :/
Von php.net:
Sie sollten 't' Modus nutzen, wenn sie mit Textdateien arbeiten und sie nutzen \n um die Zeilenenden im Skript zu begrenzen, erwarten aber, dass ihre Dateien mit Anwendungen wie etwa Notepad lesbar sind. Ansonsten sollten sie 'b' nutzen. [...]
Hinweis: Aus Portabilitätsgründen wird dringend empfohlen, dass sie immer das 'b' Flag nutzen, wenn sie Dateien mit fopen() öffnen.
Hinweis: Außerdem wird aus Gründen der Portabilität dringend empfohlen, dass sie Code umschreiben, der den 't' Modus nutzt oder sich darauf verlässt, so dass die korrekten Zeilenendungen und der 'b' Modus stattdessen genutzt werden.
Ich dachte eigentlich, dass ich mit "b" auf einem besseren Weg bin, als mit "t"...
Was für ein Krusch...
Grüße
things -
things schrieb:
Der Windows-eigene Editor »notepad« ist das schlechteste Tool, das du wählen kannst. Öffne mal die Datei mit Wordpad und staune…
Ich verwende Windows Vista (gab nur das als ich einen neuen Rechner brauchte ^^") und öffne die Dateien mit dem Editor. Das erschien mir sinnvoll. Dort habe ich die Dateien auch mal mit und mal ohne Zeilenumbruch anzeigen lassen und da gab es keinen Unterschied.
Ich bin eben sehr verwirrt, dass es mal ging und jetzt nicht mehr. Um der Zeilenumbruch-Hackerei zu entgehen schreibe ich doch extra binär "\n" als Zeilenumbruch. Das sollte dann doch überall gehen, oder!?
ist ein UNIX-Zeilenende. Der Notepad versteht das aber nicht und zeigt es deshalb auch nicht richtig an. Interessanterweise schafft es aber Wordpad oder sogar der MS-DOS »edit«.\n
things schrieb:
Das ist UTF-8. Da der Firefox aber nicht weiß, dass es sich um UTF-8 handelt, zeigt er es auch falsch an.
Inzwischen habe ich mal die Dateien im Browser geöffnet (FF): Dort sind Zeilenumbrüche zu sehen. Außerdem ist in den Dateien das zu sehen:
20.01.2013#%GroÃ?e Taten vollbracht.
In der Ausgabe und im Editor sind die Umlaute zu lesen. Das hat mit dem binär-Kram zu tun, oder? -
Hallo,
also ist es schlichtweg der absolute Basis-Editor, der damit nicht klar kommt!?
Damit kann ich wohl arbeiten. Ich danke euch vielmals für die Hilfe und Unterstützung!
Grüße
things -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage