Это видео недоступно.
Сожалеем об этом.
File fopen fclose fgets feof Programmazione C lez#24
HTML-код
- Опубликовано: 3 ноя 2015
- Introduzione ai file di testo nel linguaggio c; funzioni fopen fclose fgets feof ; avvio programma da terminale mac. Pensate bene all'output come mai si ha una doppia ripetizione dell'ultima riga? approfondito nella lezione 25
non funzionava perchè non avevi dato il nome giusto al file txt
Grazie mille!!!!
Cioè?
Molto utile, grazie!
brou con questa musica sotto e impossibile non vibare e non riesca a concentrarmi
sei stato chiarissimo! Grazie
Video utilissimo, grazie mille
Ma dopo aver utilizzato fclose, "f" a cosa diventa uguale? Essendo un puntatore dovrebbe diventare uguale a NULL?
è davvero fastidiosa la musica in sottofondo
la canzone sotto mi sembra quella di mario 64 nel livello del deserto
comunque grazie per il tutorial
Oddio grande è vero ahahha
sai come visualizzare su Xcode la linea/le linee che unisce/uniscono 2 graffe ? come accade su Visual Studio/Eclipse per intenderci.
Io vorrei far copiare al mio programma un file nascosto in win 10 , per spedire la copia via ftp su un server e nel frattempo cancellare l'originale in modo irrecuperabile.. Quanto manca con le lezioni per arivare a farlo? Grazie mille.
Poi stream a inizio file o a fine file sono importanti?
Any scam? ahahah
Non mi è chiaro un piccolo aspetto. Come fa il ciclo while a capire che ogni volta che si stampa una riga del file, fin quando la condizione non è soddisfatta, deve procedere alla riga successiva e ripetere il comando di stampa, senza l'utilizzo di un indice o di un controllo per la riga che al termine di ogni passaggio faccia spostare l'attenzione sulla nuova riga? La condizione EOF mi è chiara, è solo questo aspetto a non esserlo. Grazie a chi mi darà spiegazioni.
La funzione feof(), letteralmente File-End-Of-File, ti permette di capire quando arrivi ad un particolare punto del file, ovvero la sua fine.
While(!feof(fp)) significa "fintanto che NON mi trovo alla fine del file, procedi ad eseguire un certo insieme di istruzioni".
A questo punto, dentro al while bisogna stabilire come e cosa leggere dal file. Ci sono diverse funzioni per leggere da file: fgets, fgetc, fscanf ecc..
Come fa il computer a capire quando smettere di leggere? Semplice: nel video, con la fgets, lui sta dicendo di leggere un certo numero di caratteri (che sono poi 49, poiché l'ultimo è il carattere nullo di terminazione) e di metterli all'interno di una stringa. Quest'ultima viene poi stampata a video. Finita la lettura di quel numero di caratteri da file, al prossimo "giro" di ciclo la lettura ricomincia dal punto in cui ti eri fermata con la precedente lettura.
Soltanto chiudendo il file con fclose() e riaprendolo opportunamente potrai "ritornare" all'inizio del file per la lettura. In alternativa, esiste la fseek() per spostarti in un punto preciso del file puntato, in modo tale da leggere ciò che ti interessa.
Quindi in definitiva: il computer capisce come leggere e come muoversi "tra le righe del file" in base alla funzione che usi per leggere da file. Se esso presenta una struttura ordinata e ripetuta, ti consiglio di usare la funzione fscanf(). Esempio di file:
Mario Rossi
Paolo Verdi
Matteo Bianchi
Qui potresti benissimo leggere da file con la fscanf() un nome ed un cognome, poiché la struttura è assai precisa e le probabilità di errore sono scarse.
@@danielebattaglioli1917 ti ringrazio. Quindi è proprio una particolarità dei file testo, che se sono "aperti" continuano a scorrere fin dove arriviamo a leggerli, fin quando non li si chiudono. Ho compreso bene?
Infatti ho verificato scrivendo banalmente più volte fgets printf senza utilizzare il ciclo while e il risultato è lo stesso; cioè così:
fgets(v, 50, f);
printf("%s", v);
fgets(v, 50, f);
printf("%s", v);
fgets(v, 50, f);
printf("%s", v);
fgets(v, 50, f);
printf("%s", v);
e mi vengono stampate le diverse righe. Grazie ancora.
@@annalauragabriele1811 Corretto. È assai scomodo però l'approccio che hai usato. Ti consiglio questa soluzione: la fscanf, esattamente con la scanf, è una funzione di tipo INT poiché restituisce il numero di specificatori di formato che è riuscita a risolvere.
Esempio: supponiamo di avere un file con il nome e il cognome di una serie di persone. Tu, ovviamente, sei all'oscuro della quantità di righe presenti nel file. A questo punto, supponiamo di avere un puntatore, chiamato fp, al file che vuoi leggere.
Il file presenta questa struttura:
Mario Rossi
Marco Verdi
Paolo Bianchi
Matteo Violi
ecc..
Quindi, il file di testo ha una struttura ben definita: questo mi permette di sfruttare le proprietà della fscanf per leggere da file ricorrendo ad un ciclo while.
while(fscanf(fp, "%s %s", nome, cognome)==2)
{
printf("%s %s
", nome, cognome) ;
}
Traducendo il codice in lingua italiana, ciò equivale a dire: fintanto che con la fscanf, dal file di testo puntato dal mio puntatore fp, riesco a leggere un nome ed un cognome, procedi a stampare quanto letto con la fscanf.
Il ciclo while si interrompe quando arrivi alla fine del file. Infatti, il ciclo va avanti fintanto che la fscanf ti restituisce 2, ovvero il numero di specificatori di formato che ha risolto (cioè il numero di "variabili" che gli hai detto di leggere). La fscanf smetterà di restituirti 2, quindi smette di leggere i dati dal file con struttura ben precisa, quando arriva alla sua fine.
Per tornare all'inizio del file, al termine della lettura e dunque fuori dal ciclo while hai due possibili soluzioni:
1) Chiudi il file con fclose e lo riapri usando lo stesso puntantore;
2)Usi la funzione rewind(). Essa prende come argomento il puntatore al file di testo e ti riporta all'inizio del file, cioè in corrispondenza del byte numero 0.
3)Usi la fseek, che è molto simile alla rewind.
Sfruttare le proprietà della fscanf, come ti ho detto, è possibile SOLTANTO SE il file ha una struttura ordinata e precisa, con dati che si ripetono in maniera costante riga dopo riga. Questo ovviamente implica che nel file da leggere non ci siano errori (tornando all'esempio di prima, è come se tu supponessi che in ogni riga c'è sempre un nome ed un cognome separati dallo spazio, escludendo la possibilità che i due dati siano invertiti, ovvero che una o più righe presentino l'errore per il quale il cognome compare prima del nome.
ma come gestisci la memoria che occupa xcode?? è davvero scomodo