Está en la página 1de 3

:: LAD - Linux a Distancia :: file:///I:/CURSO PHP/CLASE 003.

htm

Introducción
Un archivo es simplemente un conjunto de bytes (o caracteres). Los archivos se dividen en dos
categorías: de texto y binarios. Si bien esta división es arbitraria ya que no hay diferencia real
entre ellos, diremos que los archivos de texto son aquellos que podemos leer y "entender" con
cualquier editor de texto (emacs, vi, mcedit, etc) y los archivos binarios son aquellos que
presentan caracteres "raros" cuando se los trata de leer.
Veremos aquí el uso de los archivos de texto.
Por lo general, cuando se lee un archivo se ven varias líneas de texto. Por ejemplo

Querido Mundo:
Hola Mundo, como has estado?

Es razonable pensar que existe alguna forma de expresar que "Hola Mundo" no se escriba al
lado de "Querido Mundo:". A pesar de que no se puede ver, hay un caracter entre estas dos
cadenas. Este caracter es el de nueva línea (el '\n'). Por defecto este es el caracter que le
indica a PHP hasta donde leer cuando se requiere una lectura.

Uso de Archivos
Apertura
Cuando se quiere utilizar un archivo (leer o escribir) primero es necesario decirle al Sistema
Operativo que nos lo "preste" para hacer lo que deseemos.
Para ello existe una función llamada fopen, que tiene la siguiente forma:

$archivo = fopen("nombre_del_archivo", "modo");

Donde $archivo es el nombre de la variable con la cual se hará referencia, dentro del script en
PHP, al archivo que haya sido abierto exitosamente. "nombre_del_archivo" es una cadena que
tiene la ruta y el nombre del archivo.
NOTA: Una vez abierto el archivo se debe usar la variable $archivo para hacer referencia al
archivo dentro del script. nombre_del_archivo es solo una cadena y no se puede ni leer ni
escribir desde o hacia ella.

Como se mencionó antes, el archivo puede ser abierto para leer, escribir o tambien para agregar.
Esto se especifica dentro de la cadena "modo". Esta cadena podrá ser "r" para abrirlo para
lectura, "w" para escritura y "a" para agregar. Por ejemplo, para escribir en el archivo
pepe.datos del directorio actual, la cadena nombre_del_archivo es "./pepe.datos" y el modo
"w". Cuando se abre un archivo para escribir si no existe el archivo, entonces este es creado, y si
existe todos los datos son eliminados. Luego de abierto se comienza a escribir desde el inicio del
archivo.
Si la intención no es la de borrar los datos, entonces se debe abrir para agregar. Cuando esto
ocurre si el archivo no existe se crea, y si existe entonces se comienza a escribir desde el fin de
datos del archivo sin borrar su contenido.
Algunos ejemplos de open son:

$datos = fopen("./datos.txt", "r"); # Abre el archivo datos.txt para leer


$estadisticas = fopen("./stats.dat", "w"); # Abre el archivo stats.dat para escribir
# y le asigna el descriptor ESTADISTICAS
$log = fopen("mensajes.log", "a"); # Abre para agregar el archivo mensajes.log

Puede ocurrir que no se pueda abrir el archivo por diversos motivos. Por ejemplo, si se abre el
archivo para lectura y el archivo no existe o no se tienen los permisos adecuados es un error.
Para ello la función open devuelve verdadero si se pudo abrir y falso en caso contrario.
Para controlar esto podríamos hacer:

$archivo = fopen("mi_archivo.txt", "r");


if(! $archivo) {
echo "ERROR al intentar abrir el archivo";
}

Esto controlaría en el if si no se pudo abrir el archivo. En cuyo caso mostraría un mensaje


informando el motivo.
Clausura
Cuando se ha terminado de usar el archivo es necesario cerrarlo para asegurarse que todo haya
quedado guardado. Para ello existe la función close a la cual solo debe especificarsele el
descriptor del archivo. Por ejemplo:

close($archivo);

Lectura
Para leer de un archivo se puede hacer de la misma forma en que se leía desde el teclado (en
realidad el teclado es un archivo). Esto se hace utilizando la misma función fgets. Por ejemplo,

$linea = fgets($archivo);

leerá una línea (hasta e incluyendo el '\n') hasta el delimitador (que por defecto es el '\n' que
separa las líneas). Con cada lectura se avanzará a la próxima línea y cuando no haya más líneas
cada lectura devolverá falso.
Para detectar que se hay llegado al final del archivo existe la función feof. Esta función
devolverá verdadero una vez que se haya leido el fin de archivo (una lectura despues del final

1 de 3 29/07/2011 03:35 p.m.


:: LAD - Linux a Distancia :: file:///I:/CURSO PHP/CLASE 003.htm

devolverá verdadero una vez que se haya leido el fin de archivo (una lectura despues del final
del archivo) y falso en otro caso. Para hacer un programa que muestre el contenido del archivo
"mi_archivo.txt" una solución sería:

$arch = fopen("1.html", "r");


while(!feof($arch)) {
$linea = fgets($arch);
echo $linea;
}
fclose($arch);

Sabiendo que la función fgets devolverá falso una vez que tratemos de leer más alla del final,
otra solución sería:

$arch = fopen("mi_archivo.txt", "r");


while($linea = fgets($arch)) {
print $linea;
}
fclose($arch);

Escritura
Para escribir en un archivo se utiliza la función fputs. Para ello se debe especificar como primer
parámetro el archivo a utilizar y luego lo que se quiera mostrar. Por ejemplo para guardar los
números del 1 al 10 en un archivo (numeros.txt):

$arch_numeros = fopen("./numeros.txt", "w");


foreach (range(1, 10) as $numero) {
fputs($arch_numeros, "$numero\n");
}
fclose($arch_numeros);

NOTA: La función range nos devuelve una arreglo cuyos valores son los números que
comprenden el intervalo especificado con sus dos parámetros.

Tuberías
Una tubería es ni más ni menos que un archivo. La diferencia esta que en vez de leer desde un
archivo de datos se leerá desde la salida de un comando, o en vez de describir en un archivo de
datos, se escribirá a la entrada de un comando.
Para crear una tubería utilizamos la función popen, que es análoga a open pero en vez de abrir
un archivo, ejecutará el programa especificado. Como diferencia tendremos solo dos modos "r" y
"w" ya que las tuberías son unidireccionales, solo podemos leer o escribir de ellas, pero no
ambas cosas sobre la misma tubería.

Para cerrar una tubería poseemos la función pclose que es igual a close pero cierra una tubería
en vez de un archivo.

Veamos un ejemplo:

$tub = popen("ps -o user ax | grep mi_usuario", "r");


$cant = 0;
while($l = fgets($tub)) {
$cant ++;
}
echo "Cantidad de procesos para mi_usuario: $cant\n";

Argumentos desde la línea de comandos


Es muy común que un script necesite el usuario le especifique sobre que archivos trabajar o que
modifique alguna conducta específica. Para ello se utilizan los parámetros que se le pasan a los
programas desde la línea de comandos. Por ejemplo el programa ls muestra todos los archivos
de un directorio. Pero si se quiere ver la información detallada de estos se le agrega un
argumento ("-l") para que lo haga.
En PHP todos estos argumentos son accedidos a través del arreglo argv. Este arreglo es creado
automaticamente por PHP y es automáticamente llenado con los argumentos. Para verificar esto
se muestra el programa args.php:

echo "Los argumentos son:\n";


foreach($argv as $indice => $argumento) {
echo "Argumento $indice: $argumento";
# notar que $argumento es lo mismo que $argv[$indice]
}

Si se ejecuta ahora:

$ args.php Hola Mundo "Hello World" 4 5 6

Mostrará por pantalla:

Los argumentos son:

2 de 3 29/07/2011 03:35 p.m.


:: LAD - Linux a Distancia :: file:///I:/CURSO PHP/CLASE 003.htm

Los argumentos son:


Argumento 0: args.php
Argumento 1: Hola
Argumento 2: Mundo
Argumento 3: Hello World
Argumento 4: 4
Argumento 5: 5
Argumento 6: 6

Ejercicios
1. ¿Que tiene de similar el teclado (STDIN), un archivo y una tuberia?
2. Hacer un programa que genere N numeros aleatorios y los guarde en un archivo uno por
linea. Tanto N como el nombre del archivo se deberan pasar desde la linea de comandos.
Para los numeros aleatorios mirar la ayuda para la funcion rand (buscar la funcion en el
sitio de php: www.php.net).
3. Hacer un programa que lea un archivo ingresado como un argumento desde la linea de
comandos (generado por el programa anterior) y que muestre solo aquellos numeros que
sean PAR.
4. Hacer un programa que lea todas las lineas de un archivo y las imprima nuevamente pero
anteponiendoles cuantas veces se repitieron dentro del mismo.
5. Hacer un programa que reciba tres nombres de archivos desde los argumentos. El
programa debe generar el tercer archivos en base a los dos primeros, intercalando las
lineas de ambos.

3 de 3 29/07/2011 03:35 p.m.

También podría gustarte