Michael: zeilenumbruch in textdateien

hallo alle zusammen,

ich erstelle mit php  eine einfache textdatei.

das sieht so aus:
 $logfilename=$file_path."/test.txt";
 $dat_handle=fopen($logfilename,"a+");
            fwrite($dat_handle,$user));
                  fclose($dat_handle);

ganz einfach - es klappt auch gut und die datei wird erstellt,
bzw die daten angehängt.

der string, der in die textdatei geschrieben wird, heißt $user.
erstellt wird er mit mehreren zeilen:
   $user_string .= $login."|".$pass."|".$name."|".$email."|".$group;

$user .= $user_string."\r\n";

mein problem:
in der textdatei wird der zeilenumbruch nciht richtig erkannt,
d.h. der text in der datei steht immer in einer zeile.
kein zeilenumbruch, nix :-((
eigentlich sollte nach jeder zeile $user_string ein zeilenumbruch kommen?

ich arbeite übrigens von einem windows-system aus auf einem linux-server.

grüße,
michael

  1. Hallo Michael!

    Möchte es nicht beschwören, aber probier' mal "\n" alleine.

    Gruß

    Matthias

    --
    ss:| zu:| ls:[ fo:| de:] va:) ch:? sh:) n4:( rl:( br:> js:| ie:% fl:) mo:}
    http://www.makaio.de/quotations
  2. Hello,

    $logfilename=$file_path."/test.txt";
     $dat_handle=fopen($logfilename,"a+");
                fwrite($dat_handle,$user));
                      fclose($dat_handle);

    Textdateien zeichnen sich dadurch aus, dass sie eine variable Zeilenlänge und ggf. auch variablen Satzaufbau ahben. Jede Zeile ist duch ein Zeilenendezeichen abgeschlossen. es gelten

    WinDOS    CRLF
    Linux     LF
    Mac       CR

    wobei
    CR = chr(13)
    LF = chr(10)

    Wenn Du nun innerhalb des Satzes in einem Datenwert auch einen Zeilenumbruch hast, dann können die einfachen Lesefunktionen den nicht vom Satzende-Zeilenumbruch unterscheiden. Direkt nach diesem Zeilenende-Zeichen fängt für das System dann der neue Datensatz an.

    Es gibt aus diesem Grunde das Standard Data Format (sdf), dass durch Billi the Gator umgetauft wurde in CSV (comma seperated values). Bedeutet aber das gleiche. Nur die Fachbegriffe werden hier überall anders verwendet. Man kennt die Separators und die Delimiter. Bei PHP heißen die Seperators Delimiter und die Delimiter Enclosure. Steigst Du noch durch?

    Wenn Du Deine Datenwerte also zusätzlich z.B. in Häkchen packst und diese verpackten Werte dann in eine Kommagetrennte Liste schreibst, dann dürfen die Datenwerte soviele Zeilenumbrüche enthalten, wie sie wollen, nur keine Häkchen. Die Delimiters(sdf) muss man dann zusätzlich maskieren.

    Das geschieht NICHT wie sonst immer üblich mit einem Backslash, sondern durch eine Doppelung des Delimiter(sdf)-Zeichens.

    also

    $user_string = ""$login","$pass","$name","$email","$group"";

    Wenn man mit Arrays arbeitet, geht das viel leichter:

    $_data['login']
    $_data['pass']
    $_data['name']
    $_data['email']
    $_data['group']

    function quot_val($val)
    {
      $quot = '"';
      return str_replace($quot,$quot$quot,$val);
    }

    $quot = '"';

    $_data = array_map('stripslashes',$_data);
      $_data = array_map('quot_val',$_data);

    $user_string = $quot.implode("$quot,$quot",$_data).$quot;

    Das kannst Du alles zu einer Funktion zusammenbauen, die Dir dann den Datensatz baut.

    Das Wegschreiben funktioniert genauso wie bisher. Denk dran, dass auf Linux-Systemen nur LF ans Ende muss. Das wiederholen der Daten funktioniert dann mit fgetcsv($fh,$len)
    http://de3.php.net/manual/en/function.fgetcsv.php

    Die Maskierungen und die Separatoren sind dann verschwunden. Man erhält ein Array zurück. Aber das steht ja schon alles in der Funktionsbeschreibung.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau