Ciao e bentornato.
Siamo in una nuova sezione.
Questa sezione è dedicata alla scrittura e alla lettura di file in ingresso e in uscita.
Ci concentreremo sui file di testo, ma parleremo anche dei file binari.
In questa lezione voglio solo fornire una panoramica, spiegare cos'è un file e spiegare come
è utile per memorizzare dati persistenti.
Fino a questo punto, tutti i dati a cui il nostro programma accede sono in memoria.
Conosciamo bene il concetto di variabile, struttura o altro.
Cancellare tutti i dati in memoria utilizzati dal programma.
Il motivo per cui viene memorizzato è che la memoria è molto veloce e vi si può accedere rapidamente
per eseguire calcoli.
Si esegue il ciclo fetch, execute e tutto il resto.
Quindi la portata, ma anche la varietà delle nostre applicazioni,
se utilizza solo la memoria, è limitata.
Sappiamo che la memoria sparisce quando il programma sparisce e questo può essere molto limitante.
Tutte le applicazioni aziendali serie richiedono una quantità di dati superiore a quella contenuta nella memoria principale.
Anche la memoria principale è molto piccola, fino a un certo punto.
E al giorno d'oggi è possibile avere molta memoria, da 1630 a 32 gigabyte.
Ma in passato, e soprattutto sui dispositivi embedded, non si disponeva di molta RAM e di conseguenza le applicazioni erano molto
limitate a causa dello spazio e delle dimensioni.
È preferibile memorizzare solo variabili e cose del genere nella memoria principale.
Anche perché la memoria principale sparisce quando il programma sparisce.
Non è possibile che i dati memorizzati siano persistenti tra i vari riavvii.
Tutto dipende quindi dalla capacità di elaborare dati persistenti e memorizzati su un dispositivo esterno,
come un disco rigido, questi grandi programmi.
Si vuole quindi avere la possibilità di memorizzare sul disco rigido.
È un po' più lento, ma si possono memorizzare molti dati e i grandi programmi hanno bisogno di memorizzare
molti dati.
Il C fornisce molte funzioni nel file di intestazione standard per la scrittura e la lettura di dispositivi esterni.
Non è necessario scrivere il proprio codice per leggere e scrivere i file, ma si può notare il vantaggio che offrono
le applicazioni che hanno la possibilità di memorizzare i dati per un periodo di tempo più lungo.
Un sacco di vantaggi.
Il dispositivo esterno utilizzato per archiviare e recuperare i dati è in genere il disco rigido o l'unità
disco.
Tuttavia, le funzioni dei file di intestazione di cui parleremo possono essere utilizzate su qualsiasi dispositivo di archiviazione esterno.
Quindi è possibile utilizzarlo su un'unità USB, su qualsiasi dispositivo esterno che memorizzi dati e su un'unità
SSD con tutti gli esempi.
Finora, tutti i dati inseriti dall'utente andavano persi.
Una volta terminato il programma, si parla di memoria volatile.
Ogni volta che si sente parlare di memoria volatile, significa che la memoria non è persistente o che i dati non sono
persistenti.
Si spegne quando il programma termina o se la macchina si riavvia.
Quindi, se l'utente vuole eseguire il programma con gli stessi dati, deve inserirli di nuovo ogni volta in modo che vengano
ripristinati.
È molto scomodo.
Limita la programmazione.
E ancora, si tratta di memoria volatile.
Quando si memorizza il materiale in file e lo si archivia sul disco rigido, si tratta di un'archiviazione permanente.
È ancora lì.
Anche quando si riavvia la macchina o quando il programma non è in esecuzione.
Si tratta della cosiddetta memoria non volatile, perché rimane intorno a un file, può memorizzare dati non volatili e di solito è memorizzata
sul disco o, al giorno d'oggi, su un'unità a stato solido o SSD.
Si tratta di una sezione di memoria denominata e lo standard IO è un file contenente l'uso di informazioni
per poter leggere e scrivere su tali file.
Ma ora utilizzeremo il concetto di scrittura e lettura dei dati da un file per l'archiviazione
permanente e noterete come le vostre applicazioni diventeranno molto più utili, molto più robuste, molto più scalabili,
perché ora abbiamo la possibilità di archiviare grandi quantità di dati e non dobbiamo preoccuparci che i dati spariscano
ogni volta che il programma finisce o il computer si riavvia.
Sarà quindi molto, molto vantaggioso utilizzare i file.
Un file all'interno del sistema operativo Linux o Windows viene memorizzato in un certo modo.
Ma per quanto riguarda il C, il linguaggio di programmazione, si tratta solo di una sequenza di byte in cui ogni byte può essere
letto singolarmente.
Questo corrisponde alla struttura dei file in Unix, ma non necessariamente.
Fa differenza solo quando si leggono i file di testo e le finestre, perché potrebbero esserci caratteri
in più di cui preoccuparsi per quanto riguarda la dimensione, ma si tratta solo di una sequenza di byte.
Quindi, se si dispone di un file di testo con un numero maggiore di byte, è comunque possibile leggere quei byte.
Bisogna solo capire cosa rappresentano quei byte.
Ecco come si presenta un file e come lo leggeremo e lo scriveremo utilizzando il linguaggio di programmazione
C.
È solo una serie di byte con diversi offset.
L'inizio del file sarebbe a zero, e poi si possono sempre trovare posizioni diverse
nel file.
Potrebbe essere quattro, potrebbe essere quattro per dieci due, potrebbe essere 100 byte.
E poi c'è la fine del file e la fine del file, di solito contrassegnata da un marcatore speciale chiamato
EOF e da un file.
Quindi un file ha un inizio e una fine e una posizione corrente.
La posizione corrente è definita da tanti byte all'inizio.
La posizione corrente è quella in cui avviene l'azione del file.
Scriverete o leggerete in quella posizione.
Parleremo anche di alcune funzioni che consentono di spostare la posizione corrente in qualsiasi
punto del file.
Anche alla fine, se volete leggere alla fine o fino alla fine.
Esistono due tipi di file.
Esistono file di testo e file binari.
Un file di testo è costituito da dati scritti come una sequenza di caratteri organizzati in righe.
Ogni riga termina con una nuova riga e i dati del testo possono variare da sistema a sistema a seconda di come vengono interpretati
i caratteri.
Per esempio, su Windows in DOS, ogni riga ha un ritorno a capo e un avanzamento di riga, quindi una barra rovesciata R e una barra
rovesciata N.
Quindi, quando si leggono i dati o si scrivono i dati, bisogna capire questo perché il formato è
un po' diverso.
Ma su Linux non c'è il backslash.
R E quindi bisogna capire come vengono scritti i dati di testo, anche se sono organizzati per righe e sono una serie
di byte, i dati binari vengono scritti come una serie di byte esattamente come appaiono in memoria.
Esempi di file con dati binari sono i dati.
I nostri file, come i dati delle immagini o i file binari di codifica musicale, non sono leggibili.
In questa sezione ci concentreremo sui file di testo, ma è possibile
scrivere qualsiasi dato in un file.
Si può scrivere come una serie di byte e come appaiono in memoria, oppure come testo.
Ma una volta che il file è stato effettivamente scritto, sarà costituito da una serie di byte, anche
se rappresentato come testo.
È possibile visualizzare i file di testo in un editor, per renderli più leggibili.
È necessario comprendere il formato del file per poterlo leggere e questo
è ciò che ho menzionato se si utilizza Windows DOS o Linux, dove Windows può avere caratteri extra quando scrive
i dati.
Pertanto, una sequenza di 12 byte in un file binario può essere costituita da 12 caratteri, da 12 interi
a otto bit di segno o da 12 interi senza segno.
I fuochi binari sono particolarmente complicati perché memorizzano Watson come memoria apparente.
Quindi, in modalità binaria, ogni singolo bit del file è accessibile.
Ma per leggere qualcosa da un file, è necessario capire cosa c'è dentro in termini di dati e come sono memorizzati.
E può dipendere dal sistema in uso.
E dipenderà anche dal fatto che si tratti di testo o di binario.
Flussi.
I programmi C vengono aperti automaticamente su tre file a vostro nome.
Un flusso può rappresentare un file, ma un flusso è un termine più generico che può rappresentare qualsiasi tipo di input.
Quindi potrebbe rappresentare la tastiera, la console, un file
o un socket.
Se siete abituati a lavorare in rete, gli stream sono un termine più generico e ci sono tre stream che vengono aperti
automaticamente nel linguaggio di programmazione C.
Uno è l'input standard, che è il normale dispositivo di input del sistema.
Di solito, per impostazione predefinita, è la tastiera.
Abbiamo usato lo standard input quando abbiamo fatto la scansione F, ma in realtà si può usare la scansione off per leggere
dai file.
Se si cambia il flusso di input, magari si cambia il flusso di input in un file di output standard che di solito viene
visualizzato sullo schermo, di solito tramite la console.
Anche l'errore standard è presente sullo schermo, ma di solito bisogna reindirizzarlo per vederlo, usando
ad esempio l'ampersand tre o qualcosa del genere.
Ma queste sono le tre uscite che ho menzionato.
L'input standard è il file che viene letto da guitar e scan F L'output standard è utilizzato da output us e print F
Abbiamo usato principalmente printf.
È anche possibile reindirizzare i file del sistema in modo che vengano riconosciuti come input output standard.
Si tratta di un reindirizzamento.
Si tratta di un concetto del sistema operativo che consente di reindirizzare i dati, ad esempio inviare l'output a un file, oppure inviare
l'input, ottenere l'input da un file, in contrapposizione allo standard.
Qui è possibile utilizzare i simboli meno di o maggiore di.
Lo scopo dell'uscita standard error è quello di fornire un luogo logicamente distinto per l'invio dei messaggi di errore.
Quindi è un po' separato, anche se viene visualizzato sullo schermo.
Per accedervi, è necessario disporre di un comando speciale.
Il flusso è una rappresentazione astratta di qualsiasi sorgente o destinazione esterna di dati.
Per questo motivo è più generico rispetto, ad esempio, a un file.
La tastiera.
La riga di comando dei file di visualizzazione su disco.
Questi sono tutti esempi di come si lavora con i flussi.
Gli stream saranno molto più importanti quando si inizierà a studiare il C++.
La libreria C fornisce funzioni per la lettura e la scrittura da e verso i flussi di dati, pertanto è possibile utilizzare le stesse funzioni
di input output per leggere e scrivere qualsiasi dispositivo esterno mappato su un flusso.
Ecco perché ho detto che si può usare la scansione F per leggere dalla tastiera.
Si può anche usare la scansione F per leggere i file.
Tutto dipende dall'input, da dove punta il flusso.
Le funzioni sono quindi molto utili e molto flessibili.
Questa è solo una panoramica di alto livello su cos'è un file e sul perché lo usiamo, sul fatto che è un dato persistente,
una memoria non volatile.
Rimane in circolazione, lo useremo e useremo il file di intestazione IO standard per leggerlo e scriverlo
quando abbiamo bisogno di memorizzare i dati per il nostro programma e i nostri programmi finiranno per essere molto più
robusti, molto più utilizzabili, molto più flessibili.
Quindi, nella prossima lezione, parleremo dell'implementazione vera e propria utilizzando le funzioni dell'header
IO standard.
Grazie.