Foros del Web » Programando para Internet » PHP »

PHP OO Problemilla con clase y fopen. Poner el puntero al inicio

Estas en el tema de Problemilla con clase y fopen. Poner el puntero al inicio en el foro de PHP en Foros del Web. He creado una miniclase para crear un fichero log Código PHP: class  log  {     var  $fichero ;     var  $fecha ;     function  agrega ( $texto ) { ...
  #1 (permalink)  
Antiguo 25/10/2012, 02:46
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 6 meses
Puntos: 58
Problemilla con clase y fopen. Poner el puntero al inicio

He creado una miniclase para crear un fichero log
Código PHP:
class log {
    var 
$fichero;
    var 
$fecha;
    function 
agrega($texto) {
        
$this->fichero  fopen("historial.log","a");
        
$this->fecha date("d-m-Y H:i:s \t");
        
fwrite($this->fichero$this->fecha $texto PHP_EOL);   
        
fclose($this->fichero);
    }
}
$log = new log;
//USO: $log->agrega("Nueva entrada de log"); 
Hasta ahí bien. el problema es que el log se escribe hacia abajo, y quisiera que las últimas entradas aparecieran arriba no abajo. Lo lógico es que se arreglaría cambiando el parámetro ya que a lo abre con el puntero al final.

El tema es que en PHP.net con los otros parámetros que abren el fichero con el puntero al inicio no me funcionan. Me sobreescriben siempre el texto, no funcionan igual que a.

He probado con r. Otra pega que tiene es que no te crea el fichero sino existe.
He probado con w. Dice que te trunca el fichero, no tengo ni idea de qué significa.
Y he probado también con x sino me equivoco.

No se puede hacer lo que quiero?

La otra solución que veo es meter las líneas actuales en una variable. Añadirlas al log y luego la nueva pero es una chapuza.

¿Alguna ayuda por favor?

Yo entiendo que lo que debería poner es "r+" pero no funciona como se espera.

Última edición por alyciashape; 25/10/2012 a las 02:53
  #2 (permalink)  
Antiguo 25/10/2012, 04:21
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 16 años, 7 meses
Puntos: 326
Respuesta: Problemilla con clase y fopen. Poner el puntero al inicio

Yo lo veo un comportamiento lógico...

Piensa en el archivo como un vector... imagina q tienes esto:

[H][o][l][a][ ][M][u][n][d][o][EOF]

Cuando abres con r, se posiciona el puntero en la posicion 0 (al principio). En esa posicion tienes la H, por ejemplo, asiq se escribes 'M' pasaria esto:
[M][o][l][a][ ][M][u][n][d][o][EOF]

Si de verdad quieres "añadir" al principio del archivo sin borrar nada, deberás leer todo el archivo, guardarlo, escribir lo nuevo y después lo viejo :O

PD: http://es1.php.net/manual/en/function.fopen.php#93272 Un comentario de php.net donde dice como resuelve lo q tu quieres hacer ;)
__________________
>> Eleazan's Source
>> @Eleazan
  #3 (permalink)  
Antiguo 25/10/2012, 05:40
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 6 meses
Puntos: 58
Respuesta: Problemilla con clase y fopen. Poner el puntero al inicio

Gracias por la explicación Eleazan, es justo lo que pasa. Si pongo unos pocos caracteres sobreescribe los primeros.

No me convence mucho esa solución, cuando tengas digamos 30.000 líneas o digamos 500 mil me parece que tirará bastante. Mejor lo que hago es leer el fechero al reves empezando por la última línea, cuando lo quiera mostrar, que eso supongo que se podrá hacer y ya está.

Gracias por la ayuda y la explicación.

Aún así no veo por qué no se puede desplazar los caracteres hacia adelante para hacer sitio a los nuevos. Probé también poniendo un salto de línea primero y luego el texto para ver si colaba pero nada. Jaja.

Aunque ahora que lo pienso me pregunto si recogiendo la primera línea, la junto con la nueva y las añado si funcionará en lugar de copiar todas, porque me da que si, ya que como digo sólo me sobreescribía la primera línea, de esta forma no gastaría mucha memoria.

De todas formas me quedo con la otra opción. O que se quede así.

Gracias y un saludo

Etiquetas: clase, fopen, inicio, puntero, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:53.