Ver Mensaje Individual
  #18 (permalink)  
Antiguo 08/08/2009, 18:50
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con fwrite

Estimados, no pude evitar meter mis narizotas en este hilo solucionado ya .

Analizando el código que publicó abimaelrc, aplicando la última sugerencia de David el Grande (dos mensajes arriba), y evaluando el resultado final de dicho código en distintas situaciones, resulta que el bucle for que hay allí no tiene utilidad alguna, ya que no realiza ninguna modificación y sólo interviene en el elemento cuyo índice es $conteo. Por lo tanto, no tiene sentido ciclar el array entero cuando sólo queremos tocar uno de sus elementos.

@metacortex, el proceso en sí sólo requiere de una comprobación (if), y el uso de trim() por el tema de las tabulaciones:

Código php:
Ver original
  1. $texto = 'mi texto';
  2. $archivo = 'mi-archivo.php';
  3. $conteo = 2;
  4.  
  5. // Ignoramos los saltos de línea
  6. $leer = file($archivo, FILE_IGNORE_NEW_LINES);
  7.  
  8. // Adiós ciclo for ;-)
  9.  
  10. // Sólo queremos trabajar sobre la línea $conteo dentro del array $leer
  11. if(isset($leer[$conteo]) and $texto != trim($leer[$conteo])) {
  12.  
  13.     // $leer[$conteo] existe, y el valor del nuevo texto ($texto) es diferente del que existe ya en el archivo (trim($leer[$conteo]))
  14.  
  15.     $leer[$conteo] = $texto;
  16.     $nueva_linea = implode("\n", $leer );
  17.     $abrir = fopen( $archivo , 'w' );
  18.     fwrite( $abrir , $nueva_linea , strlen($nueva_linea) );
  19.     fclose($abrir);
  20.  
  21. }

Cero bucles. Este código tiene las mismas características (desde el punto de vista de resultado final) que el anterior. Hay algunos puntos a tomar en cuenta que quizás los estés pasando por alto (digo quizás):
  • La primera línea de tu archivo es 0. Si conteo vale 4, hace referencia entonces a la quinta línea
  • Si $conteo hace referencia a un número de línea muy alto, tanto que no existe en el archivo, no se hará nada. Es lo mismo que hace el script anterior, ya que cicla sólo sobre los elementos del array. Por lo tanto, $conteo = 20 en un archivo de 15 líneas no hará absolutamente nada.
  • Hablas de tabulaciones. Las líneas que no se modifican las van a conservar (igual que el código anterior), pero la línea que es reemplazada quedará "pegada a la pared", a menos que el texto nuevo incluya sus propias tabulaciones. A modo de tipearte (del verbo tip ), puedes agregar tabulaciones a un string usando la marca \t (Siempre en comillas dobles, igual que \n)
Cita:
Iniciado por metacortex Ver Mensaje
Todo el santo día buscándole la caída al problemita. A esta hora ya estaba buscando ejemplos sin bucles (no me culpen, fue producto de la desesperación).
Resulta que la desesperación puede llegar en ocasiones a ser más productiva


Última edición por okram; 08/08/2009 a las 19:03