PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ECHO vs fputs: Datei lesen u schreiben



hoepfa
27-01-2009, 08:38
Hallo zusammen,

vertrauensvoll wende ich mich als php-Neuling mit Programmierkenntnissen an euch, da ich mir ein seltsames Verhalten nicht erklären kann und die SuFu bzw goole nix gebracht hat.

Hintergrund:
- Info aus einer Datei (Telefonnummern, einmal unterhalb [start_cmd] einmal unterhalb [app_cmp]) lesen und in eine andere schreiben

Problem:
- ECHO gibt alles aus was ich brauche
- fputs schreibt aber nicht das gleiche



$dateiname_cmd = $cmdpfad.".cmd";
$dateiname_ini = $imppfad.".ini";

if ( !file_exists($dateiname_ini) )
{
// error handling
}

$fp = fopen($dateiname_ini, "r");

// detecting [start_cmd]
$written = 0;
$i = 0;
do
{
$line = fgets($fp,1024);
if ($i == 10)
{
break;
}
$i++;
} while (!eregi("^start_cmd", substr($line,1,9)));
// needed: 1st line below, containing phonenumbers
$i = 0;
do
{
$line = fgets($fp,1024);
if (eregi("[0-9]",substr($line,0,1)))
{
$line_cmd[$i] = $line;
//ECHO nl2br ( $line );
//ECHO nl2br ( $line_cmd[$i] );
$written++;
break;
}
if ($i == 1)
{
break;
}
$i++;
} while (eregi("[0-9]", substr($line,0,1)) OR eregi("^;", substr($line,0,1)));

// detecting [app_cmd]
$i = 0;
do
{
$line = fgets($fp,1024);
if ($i == 200) break;
$i++;
} while (!eregi("^app_cmd", substr($line,1,9)));

// needed: Line1, Line2, Line3 containing delivery status settings
$i = 1;
do
{
$line = fgets($fp,1024);
if ( stripos ( $line, "= %1,%2,%3" ) )
{
$replace = $SimRufNr.",".$DeviceID_serial.",".$DeviceID_HW;
$line_cmd[$i] = str_replace ( "%1,%2,%3", $replace, substr ( $line, 7 ) );
$written++;
//ECHO nl2br ( $line );
//ECHO nl2br ( $line_cmd[$i] );
}
if ($i == 10) break;
$i++;
} while ( 1 );
fclose ( $fp );

// writting to cmd-file
$fp = fopen ( $dateiname_cmd, "w" );
if ( $fp != FALSE )
{
for ( $i=0; $i<20;$i++)
{
//ECHO ( $line_cmd[$i] );
fputs ( $fp, $line_cmd[$i], strlen ( $line_cmd[$i] ) );
}
}
else
{
// error handling
}



Bin leider ein bisschen ratlos. In der Datei steht eine zusätzliche Zeile (insgesamt sollten 4 Telefonnummern drinstehen) welche nirgends vorkommt, sowie einige whitespaces die auch nirgends vorkommen.

Bin ich auf dem richtigen weg oder is das komplett daneben?

hoepfa

hoepfa
27-01-2009, 10:02
Bin fündig geworden.

Ersetzt man


// writting to cmd-file
$fp = fopen ( $dateiname_cmd, "w" );
if ( $fp != FALSE )
{
for ( $i=0; $i<20;$i++)
{
//ECHO ( $line_cmd[$i] );
fputs ( $fp, $line_cmd[$i], strlen ( $line_cmd[$i] ) );
}
}
else
{
// error handling
}
fclose ( $fp );

durch


// writting to cmd-file
if ( !file_put_contents ( $dateiname_cmd, $line_cmd ) )
{
// error handling
}


Klappt alles ohne Probleme. Die whitespaces waren Grund eines hier nicht diskutierten Umwandelns. Liest sich angenehmer und spart Code.

Allerdings ist mir nicht klar warum der ursprüngliche Code nicht geklappt hat. Von daher würd ich das, wenn möglich, schon gern wissen. Hat wer eine Idee?

hoepfa

msi
27-01-2009, 20:39
einige deiner $line_cmd werte waren nicht benutzt. diese wurden aber in der for schleife auch durchgegangen und dann in die die datei geschrieben. ich vermut mal, dass daher die komishcen zeilen kamen.

hoepfa
28-01-2009, 06:56
Glaub ich jetz nicht. Sonst würde imho auch 'file_put_contents(...)' das rausschreiben. Hab das getestet mit genau der Anzahl der abgelegten Zeilen ($written) und mit einer höheren Anzahl um einfach alles rauszuschreiben. HAt keinen Unterschied gemacht.
Die whitespaces hatten sich ja geklärt.

BLUESCREEN3D
28-01-2009, 21:25
Dein Code ist ziemlich unübersichtlich, da kann man ja nichts finden.
Ein paar Tipps:
-schmeiß file_exists() raus
-benutz file() statt fopen(), da du die Datei Zeilenweise verarbeiten willst
-dann den Rückgabewert von file() prüfen (was du schon bei fopen() vergessen hast)
-benutz preg_match() statt eregi() - das gibt es ab PHP 6 nicht mehr
-du hast reguläre Ausdrücke nicht verstanden, wenn du sowas schreibst: eregi("^start_cmd", substr($line,1,9))
-warum stripos() nutzen, wenn du nach etwas suchst, das keine Buchstaben enthält?
-du prüfst den Rückgabewert von stripos() falsch. Benutz "!== false".
-fputs() nutzt du nun ja nicht mehr, aber dabei war es unnötig, die Stringlänge anzugeben.
-schreib eine Funktion, die [start_cmd] bzw. [app_cmd] findet
-$line_cmd[1] wird in der 2. Schleife mglw. überschrieben. Benutz $line_cmd[] = ...

Was genau willst du eig. erreichen?
Aus den zwei Zeilen nach [start_cmd] die erste, die mit einer Zahl beginnt und aus den 10 Zeilen nach [app_cmd] diejenigen, die "= %1,%2,%3" enthalten? Komische Anforderung.

PS: Mit einer Datenbank hättest du nicht solche Probleme ... Aber andere ;)

hoepfa
29-01-2009, 06:31
Vielen Dank für die Tipps und Anmerkungen!

Das der Code nicht übersichtlich ist, ist mir bewusst. Ist auch nicht von mir, sondern ich hatte/hab mal wieder die Ehre, Sachen zu übernehmen welche bereits existieren, schlecht dokumentiert sind und diese dann auch noch zu warten und erweitern. Wenn ich den Rest der Datei zeigen würd, hätt ich Forum verbot. :rolleyes:
Mit php hatte ich bisher nichts am Hut, von daher sind die Anmerkungen hierzu recht hilfreich. Danke nochmal!
Über die Anforderungen lass ich mich mal nicht aus. Sind nicht von mir. Basieren auf einer Datei welche, wie man so schön sagt, 'historisch' gewachsen ist. Ich glaub des reicht erstmal als Erklärung. :)