Comunidad de diseño web y desarrollo en internet online

Problema al sobreescribir fichero

Citar            
MensajeEscrito el 11 Feb 2011 10:37 am
Problema al sobreescribir fichero
Hola a todos.

Mi problema es el siguiente: Por un lado tengo un fichero que se genera al
guardar un formulario y por otro uno ya existente que quiero sobreescribir hasta un determinado token a partir del anterior.
El problema con el que me encuentro al sobreescribir el fichero es el siguiente: si el número de caracteres que quiero escribir es inferior al número que ya contiene la linea, los carácteres que sobran permanecen en el fichero y se van arrastrando al hacer la sobreescritura.

Es decir, supongamos que fichero1.txt es el fichero nuevo generado y fichero2.txt
es el fichero que voy a sobreescribir hasta un cierto token y que ya contiene texto.

fichero1.txt:

Código:

/*Linea de texto en fichero1.txt*/

fichero2.txt

Código:

/*Linea de texto en fichero2.txt con más caracteres*/
/*Token final de sobreescritura*/

y hago lo siguiente

Código:

$f1 = fopen("fichero1.txt","r+");
$f2 = fopen("fichero2.txt","r+");

while(!feof($f1)){

$buffer = fgets($f1,4096);
fputs($f2,$buffer);
fputs($f2,"\r\n");

}

Despues de sobreescribir fichero1.txt en fichero2.txt, fichero2.txt quedaría así:

fichero2.txt

Código:

/*Linea de texto en fichero1.txt*/
más caracteres*/
/*Token final de sobreescritura*/

En fichero2.txt permanecería la cadena de texto " más caracteres*/".

Vamos a suponer ahora que fichero1.txt tiene más caracteres en esa linea que fichero2.txt. Es decir,

fichero1.txt

Código:

/*Linea de texto en fichero1.txt con más caracteres*/

fichero2.txt

Código:

/*Linea de texto en fichero2.txt*/
/*Token final de sobreescritura*/

Despues de sobreescribir fichero2.txt quedaría así:

fichero2.txt

Código:

/*Linea de texto en fichero1.txt con más caracteres*/
breescritura*/

En fichero2.txt me sobreescribiria el token.

¿como podría evitar este comportamiento y eliminar esos caracteres que sobran hasta el token de final de sobreescritura o evitar que me sobreescriba algo que no quiero?
La cuestión es que ambos casos se pueden dar de forma aleatoria, a veces la linea que se va a sobreescribir tendrá más caracteres y otras veces menos.
¿Como podría controlarlo?

Por ChrisGU

3 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Feb 2011 11:41 am
buenos dias, tiene pinta de que la culpa es del fgets, ya que coges 4096 de lectura. No digo que sea exactamente eso, pero si quieres pasar lineas de un fichero a otro utiliza:

Código PHP :

while ( ($linea= fgets($fp1)) !== false) {
 fputs($f2,$linea); 
}

Por rosillo83

18 de clabLevel



 

Desarrollador Web PHP&MySQL

chrome
Citar            
MensajeEscrito el 11 Feb 2011 12:30 pm

rosillo83 escribió:

buenos dias, tiene pinta de que la culpa es del fgets, ya que coges 4096 de lectura. No digo que sea exactamente eso, pero si quieres pasar lineas de un fichero a otro utiliza:

Código PHP :

while ( ($linea= fgets($fp1)) !== false) {
 fputs($f2,$linea); 
}




Gracias por tu respuesta, es cierto que para la lectura es mejor utilizar ese código que coger los 4096 caracters pero el comportamiento que tiene es el mismo que en el caso anterior. Si la linea que voy a sobreescribir tiene más caracteres, los que sobran permanecen ahí y si la linea es más corta, consume caracteres de la siguiente línea del fichero.
Supongo que el tema esta en analizar el tamaño de la linea que va a ser sobreescrita y actuar en función de eso. A ver si doy con la solución. Un saludo.

Por ChrisGU

3 de clabLevel



 

firefox
Citar            
MensajeEscrito el 13 Feb 2011 05:45 am
mm esto parece persistencia de datos?
por q no lo serializas y asi te ahorras mucho trabajo en comprobaciones y demas
tienes varios metodos en php el
*serialize
*json_encode
*simpleXMLElement

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 14 Feb 2011 02:57 pm

tuadmin escribió:

mm esto parece persistencia de datos?
por q no lo serializas y asi te ahorras mucho trabajo en comprobaciones y demas
tienes varios metodos en php el
*serialize
*json_encode
*simpleXMLElement


gracias por tu respuesta pero no entiendo en que me puede ayudar serializar esas entradas de datos... supongo que tu idea es serializar todo el contenido del fichero destino antes de realizar sobreescritura no?

Por ChrisGU

3 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.