• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

Info fopen(), fseek(), ftell()

System32

Utente Stellare
Autore del topic
2 Gennaio 2010
15.556
112
Miglior risposta
0
E' da un bel po' che non scrivo in questa sezione...Comunque, scrivo questo post per far conoscere ( a chi ancora non le conoscesse ) tre delle tante funzioni fondamentali per "operare" sui files. La prima è fopen, la seconda è fseek e la terza è ftell. Queste tre funzioni si trovano nel file di intestazione stdio.h, l'header fondamentale per scrivere anche il più banale programma in C. Il prototipo di queste tre funzioni è il seguente :

prototipo fopen() : FILE *fopen ( char *filename , char *open_mode );

dove filename ( puntatore ) è il nome del file da aprire e open_mode ( anche questo è un puntatore ) è la modalità di apertura del file :

r - Apre un file in lettura ( read )
w - Crea un file di testo in scrittura ( write )
a - Apre un file in modalità append
rb - Apre un file binario in lettura ( readbinary )
wb - Crea un file binario in scrittura ( writebinary )
ab - Apre un file binario in modalità append ( appendbinary )
r+ - Apre un file in lettura/scrittura
w+ - Crea un file di testo in lettura/scrittura
a+ - Crea o apre un file di testo in modalità append per lettura/scrittura
r+b - Apre un file binario in lettura/scrittura
w+b - Crea un file binario in lettura/scrittura
a+b - Crea o apre un file binario in modalità append per lettura/scrittura

Se non aveste capito leggete ->
Perfavore, Entra oppure Registrati per vedere i Link!


prototipo fseek() : int fseek(FILE *stream, long offset, int whence);

dove stream ( puntatore ) è il flusso di dati ( il file, in poche parole ), offset è il punto da cui iniziare la ricerca ( seek ) e whence è una costante che varia per l'inizio del file ( SEEK_SET ), per la posizione corrente del puntatore del file ( SEEK_CUR ) o per la fine del file ( SEEK_END ). Questa funzione restituisce 0 se l'oerazione di ricerca è avvenuta correttamente, altrimenti -1. Per capire meglio : offset e whence possono essere considerati degli intervalli, ciò significa che se il valore di offset dovesse essere 0 e quello di whence fosse SEEK_END significa che il file verrà letto dall'inizio fino alla fine.

Se non aveste capito leggete ->
Perfavore, Entra oppure Registrati per vedere i Link!


prototipo ftell() : long ftell(FILE *stream);

dove stream ( puntatore ) è il flusso di dati del quale si vuole ottenere l'indicatore di posizione.

Se non aveste capito leggete ->
Perfavore, Entra oppure Registrati per vedere i Link!


A proposito di questo ho scritto un programma ( commentato ) con queste tre funzioni che prende in input un file di testo scelto dall'utente e ne restituisce la grandezza :

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

NB1 : Il programma è stato scritto con Visual Studio e come file di intestazione principale c'è stdafx ( non esiste nel C ANSI ) il quale racchiunde le funzioni del file di intestazione stdio.h.
NB2 : Inizialmente ho parlato di "prototipo di funzione" ma in realtà non ho spiegato cos'è. Nel caso in cui qualcuno non lo sapesse, un prototipo di funzione non è altro che la rappresentazione della funzione stessa. Mi spiego meglio : non è necessario scrivere il prototipo di una funzione scritta personalmente dal programmatore ( è buona norma farlo, ma non è necessario; io consiglio di farlo ). Essa serve quando ( in fase di compilazione ) il compilatore va a controllare il tipo di dato restituito ( se questa ne restituisce ), il numero dei parametri che la funzione si aspetta di ricervere e l'ordine di quest'ultimi. Nelle versioni precedenti del C questo controllo non avveniva ( l'utilizzo del prototipo delle funzioni venne preso dal C++ ) di conseguenza il compilatore non poteva individuare degli errori, i quali in fase di esecuzione del programma, avrebbero causato errori fatali dal punto di vista logico+
 
Riferimento: fopen(), fseek(), ftell()

Molto utile per i principianti alle prime imprese :buono:
Bravo per aver postato ^^