PROGRAMMIAMO
C++ - File testo: scrittura
Scrittura file

In C++ l'istruzione di scrittura su un file di testo è perfettamente analoga all'istruzione cout di scrittura sullo schermo. Si confrontino infatti le seguenti due istruzioni:

cout<<num<<"\n";
ff<<num<<"\n";

La prima istruzione scrive il valore della variabile num sullo schermo seguita da un new line. La seconda scrive il valore di num nel file di stream ff seguito da un new line.

Per esemplificare maggiormente, vediamo il seguente programma il quale acquisisce una serie di valori numerici double da tastiera e li scrive sul file di nome valori.txt:

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
fstream ff("valori.txt", ios::out);
double num;

cout<<"Fornisci una sequenza di valori positivi (negativo per terminare)";

for (;;)
{
cout<<"? ";
cin>>num;

if (num<0)
break;

ff<<num<<"\n";

}

system("PAUSE");
return EXIT_SUCCESS;
}

Si noti la direttiva #include <fstream> necessaria per poter eseguire operazioni sui file (analogamente al #include <iostream> indispensabile per poter leggere e scrivere da tastiera e su video).

Si osservi anche il \n che viene scritto sul file dopo ogni valore numerico. Tale separatore (o altri analoghi, come ad esempio un blank) è indispensabile, poiché in sua assenza i valori verrebbero scritti sul file uno di seguito all'altro (tutti attaccati) e sarebbe impossibile leggerli.

Nel programma precedente il nome del file è sempre valori.txt. Volendo sarebbe possibile fare in modo che il nome del file sia fornito dall'utente. In questo caso bisogna dichiarare un vettore di char per contenere il nome del file, in questo modo:

char nome[40];

cout<<"Nome file: ";
cin>>nome;

fstream ff(nome, ios::out);

Si noti che in quest'ultimo esempio nome non è chiuso fra apici, poiché si tratta della variabile che contiene il nome del file.

Volendo invece usare la gestione delle stringhe per mezzo delle classi (cioè nello stile del C++) occorre usare la funzione nel seguente modo:

string nome;

cout<<"Nome file: ";
cin>>nome;

fstream ff(nome.c_str(), ios::out);

Bufferizzazione della scrittura di un file

Quando si scrive su un file i valori non vengono immediatamente scritti sul disco, ma vengono temporaneamente "parcheggiati" in un'area di memoria detta buffer. Quando il buffer è pieno, i dati contenuti nel buffer vengono finalmente scritti su disco. Ciò viene fatto perché le operazioni di accesso al disco rallentano l'esecuzione di un programma e dunque risulta più veloce scrivere i dati temporaneamente in memoria e quindi svuotare il buffer sul disco con un'unica operazione (scrivendo un intero blocco di dati).

Normalmente la bufferizzazione dei dati è trasparente all'utente, nel senso che chi utilizza il programma non si accorge di questo artificio poiché in ogni caso il buffer, anche se riempito solo parzialmente, viene scritto sul disco al termine del programma. Tuttavia se il programma termina in modo non corretto, per esempio perché ne viene interrotta l'esecuzione prima della fine, i dati presenti nel buffer non vengono scritti sul disco e sono persi irrimediabilmente.

Per evitare questo possibile problema è possibile forzare lo svuotamento del buffer e la sua conseguente scrittura su disco per mezzo del manipolatore di stream endl, il quale svuota il buffer e introduce un'andata a capo (analogamente a "\n", che però non svuota il buffer). Con riferimento al programma visto precedentemente, l'uso di endl è il seguente:

for (;;)
    {
    cout<<"? ";
    cin>>num;

    if (num<0)
        break;

   ff<<num<<endl;

   }

In questo modo l'esecuzione del programma risulta più lenta, ma ogni dato viene effettivamente scritto sul file senza bufferizzazione.

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it