Successivo: , Precedente: , Su: Funzioni di tipo generale   [Contenuti][Indice]


10.2.8 Leggere un intero file in una sola volta

Spesso è conveniente avere il contenuto di un intero file disponibile in memoria, visto come un’unica stringa. Un modo chiaro e semplice per far ciò potrebbe essere questo:

function readfile1(file,    temp, contenuto)
{
    if ((getline temp < file) < 0)
        return

    contenuto = temp RT
    while ((getline temp < file) > 0)
        contenuto = contenuto temp RT

    close(file)
    return contenuto
}

Questa funzione legge da file un record alla volta, ricostruendo l’intero contenuto del file nella variabile locale contenuto. Funziona, ma non è detto che sia efficiente.

La funzione seguente, basata su un suggerimento di Denis Shirokov, legge l’intero contenuto del file in un colpo solo:

# readfile.awk --- legge un intero file in un colpo solo

function readfile(file,     temp, salva_rs)
{
    salva_rs = RS
    RS = "^$"
    getline temp < file
    close(file)
    RS = salva_rs

    return temp
}

Funziona impostando RS a ‘^$’, un’espressione regolare che non trova nessuna corrispondenza se il file ha un contenuto. gawk legge i dati dal file contenuto in temp, tentando di trovare una corrispondenza con RS. La ricerca dopo ogni lettura non ha mai successo, ma termina rapidamente, e quindi gawk inserisce in temp l’intero contenuto del file. (Vedi la sezione Controllare come i dati sono suddivisi in record per informazioni su RT e RS.)

Se file è vuoto, il codice di ritorno è la stringa vuota. Quindi, il codice chiamante può usare qualcosa simile a questo:

contenuto = readfile("/qualche/percorso")
if (length(contenuto) == 0)
    # file vuoto …

La verifica serve a determinare se il file è vuoto o no. Una verifica equivalente potrebbe essere ‘contenuto == ""’.

Vedi la sezione Leggere un intero file in una stringa per una funzione di estensione anch’essa finalizzata a leggere un intero file in memoria.


Successivo: , Precedente: , Su: Funzioni di tipo generale   [Contenuti][Indice]