olipro
Goto Top

Fputs - Zeilenende Tab und Co.

Altes Thema ... aber irgendwie hab ich es scheinbar immer noch nicht verstanden face-sad

Ich schreibe eine Datenzeile in eine Datei und möchte einen Zeilenumbruch realisieren.

So geht es nicht:
 
$ende = "\r\n";  
fputs($datei,$inhalt.$ende);


So geht es:
 
fputs($datei,$inhalt."\r\n");  

Jetzt möchte ich allerdings den Zeilenumbruch (oder sonstige Sonderzeichen) per Variable angeben können.
Kann mir jemand helfen? Ich steh gerade total im Wald ...

Content-Key: 133615

Url: https://administrator.de/contentid/133615

Printed on: April 18, 2024 at 18:04 o'clock

Member: dog
dog Jan 16, 2010 at 14:49:28 (UTC)
Goto Top
Es wäre sicher hilfreich zu erfahren, um welche Programmiersprache es geht.

PHP kann es jedenfalls nicht sein, denn da würde es funktionieren...

<?php

	$tf = tempnam('/tmp','t1');  
	var_dump($tf);
#=> string(21) "/private/tmp/t1FESoov" 
	$fh = fopen($tf,'w+');  
	
	$clrf = "\r\n";  
	$inhalt = "Hallo Welt";  
	fwrite($fh, $inhalt.$clrf);
	
	fclose($fh);
	
	var_dump(file_get_contents($tf));
#=> string(12) "Hallo Welt  
"  
?>
Member: oliPro
oliPro Jan 17, 2010 at 00:06:05 (UTC)
Goto Top
doch, ist PHP (Apache/2.0.55 (Ubuntu) PHP/5.1.2 mod_ssl/2.0.55 OpenSSL/0.9.8a mod_perl/2.0.2 Perl/v5.8.7)...
aber es geht nicht ... das wundert mich ja auch.
sitze an diesem problem schon seit stunden.


Ich hole aus einer Datenbank die Info, was ans Ende des Eintrages kommt.
$row[ende] = "\t" oder "\r\n";

Muss ich da noch irgend etwas konvertieren oder anders einlesen?
Member: oliPro
oliPro Jan 17, 2010 at 00:27:23 (UTC)
Goto Top
Hier nochmal der komplette Code:


 
			for ($i=0; $i < $countZeilen; $i++) {
				$explodeZeile = explode(':', $felderZeile[$i]);  
				if($i == ($countZeilen -1)) {
					$inhalt = $explodeZeile.$kanal[zeilentrenner];
				} else {
					$inhalt = $explodeZeile.$kanal[feldtrenner];
				}
				fwrite($datei,$inhalt);
			}
Member: dog
dog Jan 17, 2010 at 00:40:50 (UTC)
Goto Top
$inhalt = $explodeZeile.$kanal[zeilentrenner];

Die Indizes von assoziativen Arrays sind keine Konstanten, sondern Strings!!! (Aaaaaaaahhhh)

$inhalt = $explodeZeile.$kanal['zeilentrenner'];  


Scheinbar macht sich heute kein PHP-Anfänger mehr die Mühe den wichtigsten Part während der Code-Entwicklung in sein Programm aufzunehmen:
	error_reporting(E_ALL|E_STRICT);
	ini_set('display_errors', 'On');  

Und was dein Problem angeht:
Setz ein
var_dump($kanal['zeilentrenner']);  

vor Zeile 5 und guck was passiert...
Member: oliPro
oliPro Jan 17, 2010 at 00:47:35 (UTC)
Goto Top
Problem erkannt ... aber Lösung fehlt mir noch.
Das Problem entsteht hier:

$kanal = mysql_fetch_array($res);

Wenn ich $kanal['zeilentrenner'] im Script setze, geht es.
Wenn ich $kanal['zeilentrenner'] aus der DB hole, wo \r\n drin steht, geht es nicht.
Member: oliPro
oliPro Jan 17, 2010 at 01:19:12 (UTC)
Goto Top
Danke für die Info ... aber scheinbar steh ich echt auf der Leitung im Moment?!
var_dump($kanal['zeilentrenner']); liefert mir string(4) "\r\n", was doch eigentlich auch richtig ist, oder?
Member: dog
dog Jan 17, 2010 at 01:48:12 (UTC)
Goto Top
Na das Problem ist doch eindeutig:

string(4) "\r\n"  

Der String hat die Länge 4, obwohl er nur aus 2 Steuerzeichen besteht - was sagt uns das?
Genua, in dem String steht nicht CR-LF (0D 0A) drinne, sondern wortwörtlich "\r\n" (5C 72 5C 6E) (wahrscheinlich steht auch genau das in der Datenbank)...

"\r" zu schreiben und dafür ein CR-Steuerzeichen zu erhalten funktioniert nur in einem Fall: Wenn man es in den PHP-Code mit doppelten Anführungszeichen schreibt!
Member: oliPro
oliPro Jan 17, 2010 at 16:47:10 (UTC)
Goto Top
Dann müsste das doch eigentlich so funktionieren, wenn ich die Zeichen ersetzen lasse, bevor ich die Datei schreibe:

$kanal['zeilentrenner'] = str_replace("\r",chr(0D),$kanal['zeilentrenner']);  
$kanal['zeilentrenner'] = str_replace("\n",chr(0A),$kanal['zeilentrenner']);  
$kanal['feldtrenner'] = str_replace("\t",chr(09),$kanal['feldtrenner']);  

Geht aber leider nicht face-sad
Member: oliPro
oliPro Jan 17, 2010 at 16:48:44 (UTC)
Goto Top
Hast Du noch nen Tipp?
In der DB steht wortwörtlich "\r\n" (5C 72 5C 6E) drin.
Was kann ich denn noch tun, damit dies dann in der Datei korrekt geschrieben wird?
Member: dog
dog Jan 17, 2010 at 16:53:18 (UTC)
Goto Top
$kanal['zeilentrenner'] = str_replace("\r",chr(0D),$kanal['zeilentrenner']);

Das ist doch schon wieder Quark face-sad

Du versuchst hier einen echten Zeilenumbruch mit Nichts zu ersetzen...

$kanal['zeilentrenner'] = str_replace('\r',"\r",$kanal['zeilentrenner']);   

Und jetzt bitte verstehen und nicht nur kopieren.
Member: oliPro
oliPro Jan 17, 2010 at 17:00:22 (UTC)
Goto Top
Zitat von @dog:
Und jetzt bitte verstehen und nicht nur kopieren.

Sorry, verstanden habe ich dieses Thema echt noch nicht, da hast Du recht. Aber so funktioniert es.

Trotzdem vielen lieben Dank für Deine Hilfe ... ich werde mir das die Tage auf jeden Fall nochmal näher ansehen!