Monday 30 October 2017

C Gestione Dei File Binari Options


C Programming movimentazione usando open (), read (), write () e close () Gli esempi precedenti di gestione dei file accordo con blocchi di controllo di file (FCB) file. Sotto MSDOS v3.x (o superiore) e sistemi UNIX, la gestione dei file è spesso fatto usando le maniglie, invece di blocchi di controllo di file. La scrittura di programmi utilizzando le maniglie assicura la portabilità del codice sorgente tra i diversi sistemi operativi. Utilizzando le maniglie permette al programmatore di trattare il file come un flusso di caratteri. Le modalità di accesso disponibili sono le autorizzazioni vengono La funzione open () restituisce un valore intero, che viene utilizzato per fare riferimento al file. Se ONU successo, restituisce -1 e imposta la variabile globale errno per indicare il tipo di errore. La funzione read () tenta di leggere nbytes dal file associato con manico, e pone i personaggi leggono nel buffer. Se il file viene aperto utilizzando OTesto, rimuove ritorni a capo e rileva la fine del file. La funzione restituisce il numero di byte letti. Sulla fine del file, viene restituito 0, in caso di errore restituisce -1, impostando errno per indicare il tipo di errore che si è verificato. La funzione write () tenta di scrivere nbytes dal buffer al file associato con maniglia. Su file di testo, si espande ogni LF ad un CRLF. La funzione restituisce il numero di byte scritti nel file. Un valore restituito di -1 indica un errore, con errno impostato di conseguenza. La funzione close () chiude il file associato con maniglia. La funzione restituisce 0 in caso di successo, -1 per indicare un errore, con errno impostato di conseguenza. Copyright B Brown. 1984-1999. Tutti i diritti reserved. using namespace std è considerata una cattiva pratica. Così si vuole sbarazzarsi di questo. Successivamente, si dovrebbe dare variabili nomi migliori. file e il file1 sono un po 'carattere descrittivo. Entrambi vi dico che la sua un file, ma non dice che tipo di file. verificare inoltre se si dovesse effettivamente in grado di aprire il file. Ad esempio, il file potrebbe essere di sola scrittura (e la vostra file. write () funziona, ma il tuo file1.read () fallisce), di sola lettura (e la vostra file. write () fallisce, ma il tuo file1.read () opere), o nessuno dei due (ed entrambi falliscono). Che cosa è che 4. dal modo in cui il numero di elementi nella vostra altezza è un numero magico. Si potrebbe cambiare ad un certo punto, e si deve aggiornare tutto il programma. Quello è soggetto a errori. Il suo un po 'bene per un piccolo programma come questo, ma nei programmi più, si vuole dare quel numero un nome (vedi sopra), qualcosa come HEIGHTLENGTH. Lo stesso vale per BINARY. DAT. Non volete usare accidentalmente BINARY. Dar la seconda volta. Ultimo ma non meno importante: cast uso C-style come ultima risorsa. Siete alla ricerca di un reinterpretcastltchargt. A proposito, se possibile, mantenere l'ambito delle variabili piccolo: Ive ha anche aggiunto un po 'di spazio bianco. Tenete a mente: si scrive il codice sia per la macchina e le whos umani andando a leggere quel codice in seguito. Quella umana potrebbe essere voi o il vostro supervisore. Assicurarsi che la sua facile da read. Binary file con C R. A. Ford Dipartimento di Matematica. e Informatica Università di Mount Allison Sackville, NB Introduzione Uso flussi per l'elaborazione di file è certamente possibile in C, ma la maggior parte libri di testo C non includono tutte le informazioni riguardanti la funzionalità completa di corsi d'acqua. Questo documento è stato formato per aiutare gli studenti con un background in strutture C e di dati con una descrizione completa della libreria C torrente. Il documento si basa sulla documentazione libreria GNU CPP che a volte non è facile da leggere, soprattutto senza esempi. Gli operatori di inserimento ed estrazione (cioè LTLT e sono destinati ad essere utilizzati dai programmi per la scrittura e la lettura da file di testo si presuppone che il programmatore abbia familiarità con le differenze tra questi due formati di file. In realtà ci sono decine di estensioni con poco la documentazione di testo ordinario corsi d'acqua. una sezione verrà aggiunto a questo documento in un secondo momento. Nozioni di base di file IO accesso a un file binario da un programma C (non utilizzando le vecchie funzioni C) richiede in primo luogo fissare una variabile flusso al file . le classi di consueto flusso ofstream (flusso di file di output) e ifstream (flusso di file di input) sono ancora i tipi di flussi da utilizzare. a un ulteriore tipo chiamato fstream è previsto che consente di file che possono essere scritti e letti da se questo è una proprietà desiderabile (nella progettazione di programmi di tipo database, questo è spesso il caso). Prima di qualsiasi operazione può avvenire su un file, questo naturalmente deve essere aperto. e quando si è finito con il file, dovrebbe essere chiuso per evitare la perdita di dati. L'apertura di un flusso Il ifstream e ofstream ogni hanno funzioni membro denominato aperta che vengono utilizzati per collegare il flusso di un nome di file fisico e aprire il file sia per la lettura o la scrittura. La funzione membro aperta prevede anche un paio di argomenti opzionali che non vengono spesso descritto. Il prototipo più generale di questa funzione è il formato che Ive ha usato indica che gli argomenti di modalità e Prot sono opzionali. Il primo argomento è sempre il nome del file sul disco che il flusso sarà allegata al. Il modificatore const è incluso in modo che un programmatore può scrivere il nome del file (dentro le doppie virgolette) nella chiamata di funzione. L'unica parte difficile sull'utilizzo della funzione membro aperta è sotto i sistemi basati su DOS (include Windows) in cui le directory sono separati da un richiamo che la barra rovesciata ha un significato speciale in stringhe C. Il parametro Prot viene utilizzato per specificare la protezione (permesso) del file con i sistemi operativi multiutente, come Unix. Esso consente di specificare quali utenti sono autorizzati a guardare a questo file. Sotto DOSWindows, questo parametro non viene mai utilizzato. Il parametro modalità viene in genere lasciato fuori quando si tratta di file di testo, ma ci sono alcune situazioni molto utili sotto file binari per i quali deve essere impostato questo parametro. Ci sono un certo numero di opzioni che può essere dato per questo parametro. Se è necessario specificare più di uno di loro semplicemente inserire una barra verticale tra di loro. ios :: in Questo indica che il flusso verrà utilizzata per l'ingresso. Questo può sembrare ridondante per ifstreams che vengono automaticamente contrassegnati per input quando vengono aperti, ma deve essere usato occasionalmente. Quando si chiama aperto senza secondo parametro, il parametro si presume essere ios :: in, ma se si dà qualsiasi altro parametro, ad esempio ios :: binary sarà necessario specificare che il file è un file di input pure. ios :: out Questo indica che il flusso verrà utilizzata per l'uscita. Come ios :: in questo può sembrare ridondante per ofstream s, ma per lo stesso motivo di cui sopra, di solito ha da dare. ios :: mangiato Questo fa sì che il puntatore del file di punto alla fine del file quando il file viene aperto. ios :: trunc Questo fa sì che tutti i dati esistenti nel file per essere eliminati (cancellati) quando il file viene aperto. Fare molta attenzione a non usare questa opzione su un file che non vuoi ios distrutte :: binari Questo fa sì che il file per essere accessibili come file binario. Molto probabilmente sarà necessario impostare questa opzione. Se si dimentica di impostare questa opzione, molti problemi strani si verificheranno durante la lettura di alcuni personaggi come fine linea e fine del file. Esempio di apertura di un file binario: La scrittura di un file binario ho già detto una volta che LTLT viene utilizzato per scrivere i dati in un file di testo. Se si ha un x variabile che contiene il valore 354 e si è utilizzato il statment outfile LTLT x questo causerebbe il carattere 3, il carattere 5, e il carattere 4 da scrivere (in formato ASCII) al file. Questo non è formato binario che richiederebbe solo 16 bit. La classe ofstream fornisce una funzione di membro denominato scrittura che permette di informazioni che devono essere scritto in forma binaria al flusso. Il prototipo della funzione di scrittura è Questa funzione fa sì n byte da scrivere dalla locazione di memoria proposta dal buffer del disco e si sposta il puntatore del file avanti n byte. I tipi di parametri richiedono un po 'di spiegazione. Anche se il tipo di ritorno è ofstreamamp il valore di ritorno di solito è ignorata dalla maggior parte dei programmatori. Il puntatore buffer è di tipo void questo permette per qualsiasi tipo di variabile da utilizzare come primo parametro. Non si dovrebbe scrivere funzioni con i parametri di vuoto, questa è una parte molto difficile di programmazione. Il tipo streamsize è semplicemente un numero intero positivo. E 'raro che si sa esattamente quanti byte di una variabile particolare è. Per ottenere queste informazioni, C fornisce una macro (proprio come una funzione) denominata sizeof che richiede un solo parametro e restituisce la dimensione del parametro in termini di byte richiesto per la conservazione. Di seguito è un esempio di utilizzo della macro sizeof per ottenere la dimensione di una variabile e scrivere il contenuto di una variabile su disco. Si noti l'uso di una struttura piuttosto che una classe non si dovrebbe usare questo metodo per la scrittura di classi per i file binari consultare la sezione corsi di scrittura su file per una descrizione di come questo dovrebbe essere fatto. La lettura da un data lettura di file binari da un file binario è come scrivere, tranne che la funzione è ora chiamato leggere invece di scrittura Durante la lettura di dati da un file ci sono un paio di cose nuove a cui prestare attenzione: E 'la responsabilità di il programmatore per assicurarsi che il buffer è sufficientemente grande per contenere tutti i dati che si sta leggendo. Il seguente segmento di codice sarebbe probabilmente avvenuta in un incidente a meno delle dimensioni di un intero stato di 7 byte (numero improbabile): int main int x ifstream infile infile. open (silly. dat, ios :: ios binari :: a) infile ().read (ampx, 7) legge 7 byte in una cella che è o 2 o 4 Dopo aver letto qualcosa dal file, la funzione di membro fail () dovrebbe essere chiamato per determinare se l'operazione è stata completata con successo. In C, nessuna operazione di file causa il programma di fermarsi. Se si verifica un errore e non si controlla, poi il programma sarà in esecuzione inaffidabile. Vedere una sezione più avanti in questo documento riguardante il rilevamento di errori. Puntatore del file Ogni volta che i dati vengono letti o redigendi in un file, i dati sono messo o preso da una posizione all'interno del file descritto dal puntatore del file. In un file di accesso sequenziale, le informazioni vengono sempre letto dall'inizio alla fine e ogni volta che n byte viene letto o scritto, il puntatore del file viene spostato n byte avanti. In un file ad accesso casuale, siamo autorizzati a spostato il puntatore del file in diverse posizioni di leggere i dati in varie posizioni all'interno di un file. Pensate a un database completo di elementi negozio. Quando l'elemento viene scansionato alla cassa, il codice a barre viene utilizzato per cercare una descrizione e prezzo del prodotto. Se il file fosse accesso sequenziale, avremmo dovuto iniziare la ricerca all'inizio del file che è probabilmente più lento di quanto vorremmo. Questo non è un corso di elaborazione dei file, ma è sufficiente dire che se potevamo spostare il puntatore del file direttamente al record contenente i dati che avremmo dovuto leggere dal file appena once. The funzione membro tellp () ha un prototipo di il modulo Questa funzione non accetta parametri, ma restituisce la posizione indicata in byte dall'inizio del file in cui il puntatore del file è attualmente seduto. La prossima lettura o scrittura si svolgeranno da questa posizione. La funzione membro seekp () ha un prototipo di modulo vuoto seekp (posizione streampos, int relativo) Questo fa sì che il puntatore del file per passare a un'altra posizione all'interno del file. La posizione specifica il numero di byte che verranno utilizzati per determinare la posizione e il parametro relativo indica se si tratta di una sorta di richiesta di posizionamento assoluto o relativo. I valori possibili per il parente sono: ios :: chiedono Ciò significa che il luogo è il numero di byte dall'inizio del file. ios :: corr Questo indica che la posizione è il numero di byte dalla posizione corrente del puntatore del file. Questo permette un posizionamento relativo del puntatore del file. ios :: end Questo significa che il luogo è il numero di byte dalla fine del file. Consideriamo un esempio che utilizza sia ottenere e impostare la posizione del puntatore del file: int main () int x streampos pos ifstream infile infile. open infile. seekp (silly. dat, ios :: ios binari :: a) (243, ios: : beg) spostare 243 byte nel file infile. read (ampx, sizeof (x)) pos infile. tellg () cout LTLT il puntatore del file è ora nella posizione LTLT pos LTLT endl infile. seekp (0, ios :: end) chiedere alla fine del file di infile. seekp (-10, ios :: CUR) Eseguire il backup di 10 byte infile. close () Classi la scrittura di file binari il modo più semplice per memorizzare i record in file è di utilizzare una struct Se si è tenuta traccia dei record in strutture di memoria che utilizzano le classi, quindi salvando queste classi su disco prende un po 'di lavoro extra. Non si può semplicemente utilizzare una funzione di membro di scrittura e dare l'indirizzo dell'oggetto come buffer. La ragione di questo è la presenza di funzioni membro. Non avrebbe senso per salvare le funzioni membro queste funzioni membro finire per ottenere salvato come locazioni di memoria che possano causare il computer in crash se mai caricato uno dal disco con una vecchia posizione di memoria. È possibile scrivere oggetti su disco ma richiede che l'oggetto ha una funzione membro associato. Il mio approccio al solito è quello di inserire una funzione membro denominata leggere e scrivere in ogni funzione membro. Queste funzioni devono assumere un fstream come un parametro come il flusso di salvarsi a. Il vostro programma dovrebbe quindi aprire il flusso e chiamare la funzione membro con il flusso appropriata. La funzione membro deve quindi passare attraverso ogni campo di dati dell'oggetto li scrive in un ordine particolare. La funzione membro lettura deve recuperare le informazioni dal disco esattamente nello stesso ordine. L'esempio per questa sezione è un po 'coinvolto, in modo da Ive ha eliminato le funzioni membro non-file. iniziare comprendono ltiostream. h includere ltstdlib. h includono ltfstream. h cosa è andato storto In questa sezione, io sottolineare un paio di metodi per determinare se un'operazione di file ha avuto successo e se non, un paio di metodi di determing grosso modo cosa è andato storto . Dopo ogni operazione del disco, un programma ben scritto chiamerà la funzione membro non () per vedere se l'operazione è stata completata con successo. Spetta al programmatore per determinare ciò che dovrebbe accadere quando un'operazione di file va male. In sostanza ci sono tre possibilità: ignorare il problema e sperare che non accada mai. Questo è un approccio giusto da fare con gli errori per i piccoli programmi scritti per testare un'idea, ma una versione completamente funzionante di un programma non dovrebbe mai presumere che l'utente non fare un errore. Se si verifica un errore, chiamare uscita (EXITFAILURE) e hanno il programma termina. Questo è leggermente meglio che solo sperando che non accade, ma in una versione completa di un programma, questo potrebbe essere un vero e proprio fastidio per l'utente. Pensate a cosa accadrebbe se hai speso 5 ore a digitare un saggio, poi ha tentato di salvarlo nella T: che non esisteva. Se il programma appena interrotta allora si avrebbe perso 5 ore di lavoro. Quando si verifica un errore, lasciare che l'utente tenta di correggere l'errore e ripetere l'operazione. Questo è il metodo preferito per quanto riguarda l'utente è interessato, ma di solito non è banale da programma. Si dovrebbe cercare di implementare questo il più possibile. Una situazione spiacevole si pone quando si tratta di errori, sono cose generalmente fisiche che rendono il sistema operativo li dipendente. Poi, voglio elencare l'ANSI (standard) approccio per trattare con gli errori e l'approccio DOS per trattare con gli errori. L'approccio ANSI è molto più generale e, pertanto, i messaggi di errore non saranno precisi, ma l'approccio ANSI funziona, non importa quale compilatore C si utilizza. La gestione degli errori DOS elimina alcuni dei confusione su quello che è successo, ma, ovviamente, è buono solo su macchine DOS che supportano la libreria (Turbo C, Borland C, e GNU G sostenere questa libreria). Per rendere le cose un po 'più brutta, sembra che vi sia alcun supporto errore integrato in flussi diversi la funzione fail (). Per combattere gli errori che dobbiamo fare affidamento su alcune funzioni C esistenti che non sono un problema di utilizzare da C rispetto ad un C è semplicemente un'estensione di errori C. ANSI ANSI C supporta una variabile globale (oh no, una variabile globale) che si chiama errno che può essere si accede inserendo errno. h Quando si verificano errori la variabile è impostata su un codice di errore standard che dovrebbe essere equivalente su tutti i sistemi operativi. Ci sono troppi codici di errore di fastidio lista in questo documento. Di solito il modo migliore per scoprire tutti i codici di errore è quello di guardare la pagina di manuale o la guida in linea alla ricerca sulla parola chiave errno Il file di inclusione non definire una serie di costanti che possono essere utilizzati per determinare il tipo di errore che si è verificato. Ad esempio, il codice di errore 22 indica che il file si è tentato di aprire solo non esisteva. Un modo leggermente meglio dire 22 è utilizzare il ENOENT costante. C'è una funzione in stdio. h perror nome che prende una stringa come parametro. Quando questa funzione viene chiamata, la stringa viene visualizzato sullo schermo seguita da due punti poi da un messaggio che descrive il valore di errno Questo può essere utile se non si desidera scrivere gestori di errori e vogliono solo il programma di fermarsi. Di seguito è riportato un semplice programma che legge un nome di file da parte dell'utente, apre il file e visualizza il fatto che l'unità non era pronta, il file non esiste o il messaggio di errore standard. principali dati ifstream () char filename50 cout LTLT file da aprire cin. getline (nome del file, 50) data. open (nome del file) se caso (data. fail ()) Interruttore (errno) EACCES: questo è impostato se l'unità non è pronta in DOS cout LTLT Unità non pronta o permesso negato LTLT caso pausa endl ENOENT: cout LTLT Impossibile trovare questo file LTLT predefinito pausa endl: perror (apertura di file di dati) uscita (EXITFAILURE) un vero e proprio programma sarebbe poi loop back e chiedere all'utente di riprova. . DOS Errori esteso se si guardano gli errori indicate nell'elenco ANSI si noterà che non molti di loro sono realmente orientati verso DOS cioè non si sa con certezza se un settore è stato male su un disco o lo sportello dell'unità è stato lasciato aperto. Questo perché lo standard ANSI è più o meno definito sistema UNIX dove questi tipi di errori non sono mai visti dagli utenti. La maggior parte dei compilatori basati su DOS forniscono un paio di funzioni per acessing DOS errore che usuallt fornisce una descrizione molto più accurata del error. File Handling in linguaggio C Un file rappresenta una sequenza di byte sul disco in cui è memorizzato un gruppo di dati correlati esteso . File viene creato per la memorizzazione permanente dei dati. Si tratta di una struttura realizzata pronta. Nel linguaggio C, usiamo un puntatore struttura del tipo di file per dichiarare un file. C fornisce una serie di funzioni che consente di eseguire le operazioni di base sui file. Di seguito sono riportate le funzioni, creare un nuovo file o aprire un file esistente legge un carattere da un file scrive un carattere in un file legge un insieme di dati da un file scrive una serie di dati in un file Legge un numero intero da un file scrive una intero in un file di impostare la posizione di desiderare punto dà la posizione corrente nel file impostare la posizione del punto di inizio apertura di un file o creazione di un file i fopen () viene utilizzato per creare un nuovo file o aprire un file esistente. Ecco il nome del file è il nome del file da aprire e la modalità specifica allo scopo di aprire il file. Modalità può essere di tipi seguenti, fp è il puntatore del file (FILE fp), che terrà il riferimento al file aperto (o creato). apre un file di testo in modalità di lettura si apre o si crea un file di testo in modalità di scrittura. apre un file di testo in modalità di accodamento apre un file di testo sia in modalità lettura e scrittura si apre un file di testo in lettura e modalità di scrittura si apre un file di testo sia in modalità lettura e scrittura si apre un file binario in modalità di lettura si apre o si crea un file binario in modalità di scrittura si apre un file binario in modalità append apre un file binario sia in modalità lettura e scrittura si apre un file binario sia in modalità lettura e scrittura si apre un file binario sia in modalità lettura e scrittura chiusura di un file viene utilizzata la funzione fclose () per chiudere un file già aperto. Qui fclose () funzione chiude il file e restituisce zero in caso di successo, o EOF se si verifica un errore in chiusura del file. Questo EOF è una costante definita nel file di intestazione stdio. h. InputOutput operazione sul file nella tabella di cui sopra abbiamo discusso su vari file di funzioni IO per eseguire la lettura e la scrittura su file. getc () e putc () sono funzioni più semplici utilizzati per leggere e scrivere i singoli caratteri in un file. Lettura e scrittura da file utilizzando fprintf () e fscanf () In questo programma, abbiamo creare due puntatori a file ed entrambi sono Facendo riferimento allo stesso file, ma in modi diversi. la funzione fprintf () scrive direttamente nel file, mentre fscanf () legge dal file, che può essere stampato su console usinf funzione printf standard (). La differenza tra la modalità di accodamento e scrittura modalità di scrittura (w) e aggiungere (a) modalità, durante l'apertura di un file sono quasi la stessa. Entrambi sono usati per scrivere in un file. In entrambe le modalità, viene creato un nuovo file se doesnapost esiste già. L'unica differenza che hanno è, quando si apre un file in modalità di scrittura, il file viene azzerato, con conseguente cancellazione di tutti i dati già presenti nel file. In modalità di aggiunta questo non accadrà. accodamento viene utilizzata per aggiungere o aggiungere dati ai dati esistenti del file (se presente). Quindi, quando si apre un file in Append (a) modalità, il cursore si trova alla fine degli attuali dati nel file. Leggere e scrivere in un file binario un file binario è simile al file di testo, ma contiene solo dati di grandi dimensioni numeriche. Le modalità di apertura sono menzionati nella tabella per l'apertura modalità sopra. funzioni fread () e fwrite () vengono utilizzati per leggere e scrivere è un file binario. fread () è utilizzato anche nello stesso modo, con gli stessi argomenti come funzione fwrite (). Qui di seguito menzionato è un semplice esempio di scrittura in un file binario fseek (), ftell () e rewind (funzioni) fseek () - È usato per spostare il controllo a leggere per diverse posizioni con la funzione fseek. ftell () - Racconta la posizione di byte di posizione corrente del cursore nel puntatore del file. riavvolgimento () - Si muove il controllo all'inizio del file. Alcuni esempi programma di gestione di file

No comments:

Post a Comment