8796 sujets

Développement web côté serveur, CMS

Bonsoir,

Je suis face à un phénomène bizarre.
J'ai l'habitude en VB6 de finir tous mes records
de longueur fixe (ex. 256 Bytes) par un chr(13) et chr(10)
dans les 2 derniers caractères de chaque record.
Et cela fonctionne toujours à merveille.

Par contre, en PHP, c'est loin d'en être le cas...

Voici un petit exemple de code,
En retour, j'aurai dû obtenir "record3"...
Hélàs, c'est pas cela que j'obtiens...

Pouvez-vous m'aider, svp ?
Merci d'avance.

<?php
	date_default_timezone_set('Europe/Brussels');
	
	$blancs = str_repeat(" ", 256);
	$finrecord = chr(13).chr(10);
	$mot = "record";
	
	$newfichier = fopen('essai.txt','w');
	for ($i=1; $i<10; $i++) {
		$record = substr($mot.$i.$blancs,0,254);
		$record = $record.$finrecord;
		fputs ($newfichier, $record, 256);
	}
	fclose($newfichier);
	
	
	$nomfichier = fopen('essai.txt','r');
	$record = fgets($nomfichier,256);
	$record = fgets($nomfichier,256);
	$record = fgets($nomfichier,256);
	
	$test=substr($record,0,7);
	print $test;
	
	fclose($nomfichier);
	
?>

Modifié par jytest (23 Oct 2010 - 11:35)
Voilà le code

<?php
	date_default_timezone_set('Europe/Brussels');
	
	$blancs = str_repeat(" ", 256);
	$finrecord = chr(10);
	$mot = "record";
	
	$newfichier = fopen('essai.txt','w');
	for ($i=1; $i<10; $i++) {
		$record = substr($mot.$i.$blancs,0,255);
		$record = $record.$finrecord;
		fputs ($newfichier, $record, 256);
	}
	fclose($newfichier);
	
	
	$nomfichier = fopen('essai.txt','r');
	$record = fgets($nomfichier,256);
	$record = fgets($nomfichier,256);
	$record = fgets($nomfichier,256);
	
	$test=substr($record,0,7);
	print $test;
	
	fclose($nomfichier);	
?>
<?php
	date_default_timezone_set('Europe/Brussels');
	
	$blancs = str_repeat(" ", 256);
	$finrecord = chr(10);
	$mot = "record";
	
	$newfichier = fopen('essai.txt','w');
	for ($i=1; $i<10; $i++) {
		$record = substr($mot.$i.$blancs,0,255);
		$record = $record.$finrecord;
		fputs ($newfichier, $record, 256);
	}
	fclose($newfichier);
	
	
	$nomfichier = fopen('essai.txt','r');
	$record = fgets($nomfichier,256);
	$record = fgets($nomfichier,256);
	$record = fgets($nomfichier,256);
	
	$test=substr($record,0,7);
	print $test;
	
	fclose($nomfichier);
	
?>
Pourquoi mon code ne s'affiche pas
malgré les balises fournies pour le forum...
Le voici à l'état brut :

	date_default_timezone_set('Europe/Brussels');
	
	$blancs = str_repeat(" ", 256);
	$finrecord = chr(10);
	$mot = "record";
	
	$newfichier = fopen('essai.txt','w');
	for ($i=1; $i<10; $i++) {
		$record = substr($mot.$i.$blancs,0,255);
		$record = $record.$finrecord;
		fputs ($newfichier, $record, 256);
	}
	fclose($newfichier);
	
	
	$nomfichier = fopen('essai.txt','r');
	$record = fgets($nomfichier,256);
	$record = fgets($nomfichier,256);
	$record = fgets($nomfichier,256);
	
	$test=substr($record,0,7);
	print $test;
	
	fclose($nomfichier);
	

Modifié par jytest (18 Oct 2010 - 21:16)
Salut jytest

Enlève <?php et ?> : c'est un bug du programme sur Alsa j'imagine
Essais le sur ton dernier message en rééditant Smiley cligne

++
Modifié par zardoz (18 Oct 2010 - 21:14)
Salut...

Bon les fichiers en php c'est pourtant très simple à gérer...

Si tu n'est pas obligé de garder ton séparateur version VB, tu pourrais par exemple traiter ton fichier en CSV

Sinon pour des découpages il te suffit de décider par toi même d'un séparateur...

L'approche substr est assez bizarre dans le contexte de ce que tu expliques...

Peut être pourrait tu mettre le fichier ou tout du moins quelques lignes de celui- ci pour que l'on puisse t'aiguiller...

As tu regarder dans la doc php les fonctions sur le csv ? les traitement de FILES ? pousser un peu du côté des Array ??

Enfin voilà.. là le code il apporte pas grand chose par rapport à ton résultat obtenu...
D'abord, un grand merci d'être passé par ici.

Si tu permets, je vais me permettre de reprendre ton message, point par point,
pour que mon souci soit mieux précisé et compris aux yeux de tous.




a écrit :

Si tu n'est pas obligé de garder ton séparateur version VB, tu pourrais par exemple traiter ton fichier en CSV

Dommage, j'ai besoin de cela...

a écrit :

As tu regarder dans la doc php les fonctions sur le csv ? les traitement de FILES ? pousser un peu du côté des Array ??

Oh oui, cela fait 2 jours que mon ami google et moi,
(re)cherchons désespérément une solution ensemble.

a écrit :

Peut être pourrait tu mettre le fichier ou tout du moins quelques lignes de celui- ci pour que l'on puisse t'aiguiller...

a écrit :

L'approche substr est assez bizarre dans le contexte de ce que tu expliques...

Le code se voulait (très voire trop) simple...
Dans le fichier "essai.txt" à enregistrements de longueur fixe de 256 bytes,
je remplis 9 records, contenant chacun dans leurs 7 premières positions "recordx".
Je lis 3 records.
Je devrais donc obtenir en print : "record3" !!!
Et bien non, j'obtiens "record2" !!!
Cela veut donc dire que j'ai (sûrement ou peut-être) des soucis avec le LF et le CR.

a écrit :

Enfin voilà.. là le code il apporte pas grand chose par rapport à ton résultat obtenu...

Je sais. Le but de ce code n'est autre que de donner un exemple simple.
salut...

bon du coup j'ai regardé et j'ai testé.. et j'ai compris Smiley lol

Donc tu insère 256 caractères en tout... TOI ! sauf que fwrite ajoute lui aussi une fin de ligne...

Du coup quand tu fait le fgets en allant chercher les 256 caractères, tu en laisse un en rab...
Comme fgets lit là où se trouve le pointeur, il prend le 257 ème caractères dispo avant la fin de ligne posée par fwrite...

fait ton fgets avec la valeur 257 et non 256 et tu aura ce que tu veux

@++
date_default_timezone_set('Europe/Brussels');

// Ta variable $blancs ne sert à rien, des fonctions PHP font ce que tu veux faire
// Il me semble que tu voulais ce couple de caractère en fin de ligne d'après ton premier message
$finrecord = chr(13).chr(10);
$mot = 'record';

$newfichier = fopen('essai.txt','w');
for($i = 1; $i < 10; $i++) {
    // La fonction str_pad fait exactement ce que tu veux, à savoir compléter une chaine par des espaces sur la droite jusqu'à une longueur de chaine de 256. Il y a d'autres paramètres aussi, je te renvoi à la doc
    $record = str_pad($mot.$i, 256);
    $record .= $finrecord;
    fwrite($newfichier, $record);
}
fclose($newfichier);


$nomfichier = fopen('essai.txt','r');
// J'ai supprimé la longueur de tes fgets également. En l'absence de longueur, il prend de lui même les lignes (qui sont délimitées par le chr(13) et chr(10))
$record = fgets($nomfichier);
$record = fgets($nomfichier);
$record = fgets($nomfichier);

$test = substr($record,0,7);
print $test;

fclose($nomfichier);


Il y a sûrement des choses qu'on peut arranger (trim() au lieu de substr() à la fin par exemple), mais je pense que ça fonctionne comme tu le souhaite ainsi.

J'éspère que ça pourra t'aider Smiley cligne