En este tema, aprenderemos cómo manejar archivos en Haskell. Trabajar con archivos es una habilidad esencial para cualquier programador, ya que permite leer y escribir datos persistentes. Cubriremos los siguientes puntos:

  1. Apertura y Cierre de Archivos
  2. Lectura de Archivos
  3. Escritura en Archivos
  4. Manejo de Errores

  1. Apertura y Cierre de Archivos

Para trabajar con archivos en Haskell, utilizamos el módulo System.IO. Este módulo proporciona funciones para abrir, cerrar, leer y escribir archivos.

Apertura de Archivos

Para abrir un archivo, utilizamos la función openFile, que toma dos argumentos: el nombre del archivo y el modo de apertura (ReadMode, WriteMode, AppendMode, ReadWriteMode).

import System.IO

main :: IO ()
main = do
    handle <- openFile "example.txt" ReadMode
    -- Realizar operaciones con el archivo
    hClose handle

Cierre de Archivos

Es importante cerrar el archivo después de terminar de usarlo para liberar los recursos del sistema. Utilizamos la función hClose para cerrar el archivo.

hClose handle

  1. Lectura de Archivos

Haskell proporciona varias funciones para leer archivos. Las más comunes son hGetContents, hGetLine y hGetChar.

Leer Todo el Contenido del Archivo

La función hGetContents lee todo el contenido del archivo y lo devuelve como una cadena.

import System.IO

main :: IO ()
main = do
    handle <- openFile "example.txt" ReadMode
    contents <- hGetContents handle
    putStrLn contents
    hClose handle

Leer Línea por Línea

La función hGetLine lee una línea del archivo.

import System.IO

main :: IO ()
main = do
    handle <- openFile "example.txt" ReadMode
    line <- hGetLine handle
    putStrLn line
    hClose handle

Leer Caracter por Caracter

La función hGetChar lee un carácter del archivo.

import System.IO

main :: IO ()
main = do
    handle <- openFile "example.txt" ReadMode
    char <- hGetChar handle
    putStrLn [char]
    hClose handle

  1. Escritura en Archivos

Para escribir en archivos, utilizamos las funciones hPutStr, hPutStrLn y hPutChar.

Escribir una Cadena

La función hPutStr escribe una cadena en el archivo.

import System.IO

main :: IO ()
main = do
    handle <- openFile "example.txt" WriteMode
    hPutStr handle "Hello, Haskell!"
    hClose handle

Escribir una Línea

La función hPutStrLn escribe una cadena seguida de un salto de línea.

import System.IO

main :: IO ()
main = do
    handle <- openFile "example.txt" WriteMode
    hPutStrLn handle "Hello, Haskell!"
    hClose handle

Escribir un Carácter

La función hPutChar escribe un carácter en el archivo.

import System.IO

main :: IO ()
main = do
    handle <- openFile "example.txt" WriteMode
    hPutChar handle 'H'
    hClose handle

  1. Manejo de Errores

Es importante manejar errores al trabajar con archivos para evitar que el programa falle inesperadamente. Utilizamos la función catch del módulo Control.Exception para capturar excepciones.

import System.IO
import Control.Exception

main :: IO ()
main = do
    result <- try (openFile "nonexistent.txt" ReadMode) :: IO (Either IOException Handle)
    case result of
        Left ex  -> putStrLn $ "Error: " ++ show ex
        Right handle -> do
            contents <- hGetContents handle
            putStrLn contents
            hClose handle

Ejercicio Práctico

Ejercicio 1: Leer y Escribir Archivos

  1. Crea un programa que lea el contenido de un archivo llamado input.txt y lo copie a un archivo llamado output.txt.
  2. Asegúrate de manejar cualquier error que pueda ocurrir durante la lectura o escritura de los archivos.

Solución

import System.IO
import Control.Exception

main :: IO ()
main = do
    result <- try (openFile "input.txt" ReadMode) :: IO (Either IOException Handle)
    case result of
        Left ex -> putStrLn $ "Error al abrir input.txt: " ++ show ex
        Right inHandle -> do
            contents <- hGetContents inHandle
            outResult <- try (openFile "output.txt" WriteMode) :: IO (Either IOException Handle)
            case outResult of
                Left ex -> putStrLn $ "Error al abrir output.txt: " ++ show ex
                Right outHandle -> do
                    hPutStr outHandle contents
                    hClose outHandle
            hClose inHandle

Resumen

En esta sección, hemos aprendido cómo manejar archivos en Haskell. Hemos cubierto cómo abrir y cerrar archivos, leer y escribir datos, y manejar errores. Estos conceptos son fundamentales para trabajar con datos persistentes en Haskell y te preparan para tareas más avanzadas en programación funcional.

En el próximo tema, exploraremos cómo interactuar con el sistema utilizando Haskell.

© Copyright 2024. Todos los derechos reservados