Condivisione della tecnologia

[Linguaggio C] Gioca con le operazioni sui file

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

🌟🌟Home page dell'autore:effimeri__

🌟🌟Colonna di appartenenza:Linguaggio C

Sommario

introduzione

1. Apertura e chiusura di file

1. flusso

2. Flusso standard

3. File di testo e file binari

4. Funzioni che controllano l'apertura e la chiusura dei file

2. Lettura e scrittura sequenziale di file

3. Lettura e scrittura casuale di file

1.funzione di ricerca

funzione 2.ftell

funzione 3.rewind

4. Determinazione della fine della lettura del file

Riassumere


introduzione

Quando scriviamo programmi, spesso memorizziamo i dati in variabili. Se il programma esce e la memoria viene recuperata, questi dati andranno persi. Quindi esiste un modo per salvare in modo persistente questi dati in modo che esistano ancora quando il programma viene riaperto? La risposta è si. Cosa può fare questo è:Operazioni sui file

1. Apertura e chiusura di file

1. flusso

I dati del programma devono essere inviati a dispositivi esterni e devono anche essere immessi da dispositivi esterni. Per diversi dispositivi, i metodi di input e output sono diversi. Per facilitare le nostre operazioni su vari dispositivi di input e output, abbiamo il concetto altamente astratto di "stream". Nel linguaggio C, le operazioni di input e output su file, schermi, tastiere, ecc. vengono tutte eseguite tramite "flussi". In generale, se vogliamo scrivere dati o leggere dati, dobbiamo aprire lo stream.

2. Flusso standard

Quando viene avviato un programma in linguaggio C, il valore predefinito ètre flussiGià aperto per noi:

standard-din--Flusso di input standard, input dalla tastiera nella maggior parte dei casi.

uscita standard--Stream di output standard, nella maggior parte dei casi output sul monitor.

standardizzazione--Flusso di errore standard, visualizzato sul monitor nella maggior parte dei casi.

Poiché questi tre flussi sono stati aperti per impostazione predefinita, possiamo eseguire direttamente operazioni di input e output utilizzando funzioni come scanf e printf.

Questi tre flussi hanno anche dei tipi.Puntatore del file (FILE*) .Quando eseguiamo operazioni sui file, passiamoLa variabile puntatore file può trovare indirettamente il file ad essa associato.

3. File di testo e file binari

A seconda di come sono organizzati i dati, vengono chiamati i file di datifile di testoOfile binario . I dati vengono archiviati in forma binaria nella memoria,Se viene inviato a un file di archiviazione esterno senza conversione, lo èfile binario
Se è necessario memorizzarlo in codice ASCII in una memoria esterna, è necessario convertirlo prima della memorizzazione.Un file memorizzato sotto forma di caratteri ASCII èfile di testo
Come viene archiviato un dato in un file?
I caratteri vengono sempre memorizzati in formato ASCII e i dati numerici possono essere memorizzati in formato ASCII o binario. Ad esempio, se c'è un intero 10000, se viene emesso sul disco sotto forma di codice ASCII, occuperà 5 byte sul disco (un byte per ogni carattere), mentre se viene emesso in forma binaria, occuperà solo 4 byte sul disco.

4. Funzioni che controllano l'apertura e la chiusura dei file

Dopo aver compreso questi prerequisiti, arriviamo al punto: aprire e chiudere file. Il linguaggio C fornisce due funzioni, responsabili rispettivamente dell'apertura e della chiusura dei file. I prototipi sono i seguenti:

apri un file:
FILE * foaperto ( const char * nome file, const char * modalità );
Chiudi il file:
interno fchiudi ( FILE * flusso );

La funzione fopen ha due parametri,Il primo parametro è espresso sotto forma di stringanome del file, il secondo parametro è il fileMetodo aperto, rappresentato da una stringa .Quando utilizziamo questa funzione, dobbiamo creare un filevariabile del puntatore del file Per ricevere, quando il file non si apre, restituisce un puntatore null. Per quanto riguarda le modalità di apertura, ecco le seguenti:

Metodo apertoSensoSe il file specificato non esiste
"r" (sola lettura)
Per inserire i dati, aprire un file di testo esistente
Restituisce un puntatore nullo
"w" (solo scrittura)
Per generare i dati, aprire un file di testo
Crea un nuovo file
"a" (aggiungi)Aggiungi dati alla fine del file di testoCrea un nuovo file
"rb" (sola lettura)Per inserire i dati, aprire un file binarioRestituisce un puntatore nullo
"wb" (solo scrittura)Per generare i dati, aprire un file binarioCrea un nuovo file
"ab" (aggiungi)Aggiungi dati alla fine di un file binarioCrea un nuovo file
"r+" (lettura e scrittura)Per leggere e scrivere, aprire un file di testoRestituisce un puntatore nullo
"w+" (leggere e scrivere)Per leggere e scrivere, creare un nuovo file di testoCrea un nuovo file
"a+" (leggere e scrivere)Apri un file e leggi e scrivi alla fine del fileCrea un nuovo file
"rb+" (lettura e scrittura)Apri un file binario per la lettura e la scritturaRestituisce un puntatore nullo
"wb+" (lettura e scrittura)
Per leggere e scrivere, crea un nuovo file binarioCrea un nuovo file
"ab+" (leggere e scrivere)
Apri un file binario e leggi e scrivi alla fine del fileCrea un nuovo file

Per la funzione fclose, il suo parametro è il puntatore al file, che viene utilizzato per chiudere il file puntato dal puntatore al file.

Successivamente, proviamo ad aprire e chiudere un file:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. FILE* pf = fopen("test.txt", "w");
  5. if (pf == NULL)//文件打开失败则退出程序
  6. {
  7. perror("fopen");
  8. return 0;
  9. }
  10. printf("文件打开成功n");
  11. fclose(pf);
  12. pf = NULL;//避免出现野指针,及时制空
  13. return 0;
  14. }
risultato dell'operazione:

Si può vedere che poiché il metodo di apertura è "w", nel percorso appare un file denominato "test.txt".

2. Lettura e scrittura sequenziale di file

Successivamente, introduciamo diverse funzioni perLeggere o scrivere dati in un file

Nome della funzioneFunzioneApplicabile a
fgetcFunzione di immissione dei caratteriTutti i flussi di input
inserimentofunzione di uscita dei caratteriTutti i flussi di output
ottieneFunzione di immissione della riga di testoTutti i flussi di input
fputsFunzione di output della riga di testoTutti i flussi di output
scansioneFunzione di input del formatoTutti i flussi di input
stampafFunzione di output del formato Tutti i flussi di output
pauraIngresso binarioFlusso di input del file
scrivereUscita binariaFlusso di output del file

Successivamente proviamo a utilizzarescansioneEstampaffunzione:

Il primo parametro di queste due funzioni è un puntatore al file, che viene utilizzato per leggere e scrivere i dati del file. I parametri successivi sono gli stessi delle funzioni scanf e printf.

  1. #include <stdio.h>
  2. int main()
  3. {
  4. FILE* pf = fopen("test.txt", "w");//要写入数据,以写的形式打开文件
  5. if (pf == NULL)
  6. {
  7. perror("fopen");
  8. return 0;
  9. }
  10. fprintf(pf, "123456");//向文件中写入数据
  11. fclose(pf);
  12. pf = NULL;
  13. return 0;
  14. }

Come puoi vedere, i dati sono stati scritti nel file. Successivamente utilizziamo la funzione fscanf per stampare i dati del file sullo schermo:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char str[20] = { 0 };
  5. FILE* pf = fopen("test.txt", "r");//要读取数据,以读的形式打开文件
  6. if (pf == NULL)
  7. {
  8. perror("fopen");
  9. return 0;
  10. }
  11. fscanf(pf, "%s", str);//读取数据到str当中
  12. printf(str);
  13. fclose(pf);
  14. pf = NULL;
  15. return 0;
  16. }
risultato dell'operazione:

3. Lettura e scrittura casuale di file

1.funzione di ricerca

La funzione della funzione fseek èIn base alla posizione e all'offset del puntatore del fileposizionepuntatore del file . Il suo prototipo è il seguente:

int fseek ( FILE * flusso, long int offset, int origine );

Il suo primo parametro è il puntatore del file, il secondo parametro è l'offset relativo alla posizione impostata e il terzo parametro è la posizione impostata.

Il linguaggio C ne definisce treMacro, puoi sceglierne uno come terzo parametro:

SEEK_SET: posizione iniziale del file

SEEK_CUR: la posizione corrente del puntatore del file

SEEK_END: ​​fine del file

Dopo aver individuato il puntatore del file, possiamo leggere o scrivere nella posizione specificata del file.

funzione 2.ftell

La funzione ftell viene utilizzata per restituireL'offset del puntatore del file rispetto alla posizione iniziale . Prototipo di funzione:

int lungo ftell ( FILE * flusso );

funzione 3.rewind

viene utilizzata la funzione di riavvolgimentoRiporta la posizione del puntatore del file all'inizio del file . Il suo prototipo di funzione:

void rewind ( FILE * stream );

4. Determinazione della fine della lettura del file

1. Perfile di testo, possiamo prima usarefgetcLa funzione scorre i caratteri nel file finché non viene letto EOF, indicandoLa lettura del file termina

2. Perfile binario,Noi usiamopauraLa funzione determina il suo valore restituito:È inferiore al numero effettivo da leggere? .Se è inferiore aLa lettura termina.

Per i due casi precedenti, il fileAlla fine della lettura, possiamo continuare a giudicareMotivo per cui è terminata la lettura del file . Introdurre due funzioni:feudoEferro

feudoFunzione utilizzata perDetermina la fine della lettura del filemotivose o noÈ stata rilevata la fine del file . Il suo prototipo è il seguente:

int feof ( FILE * flusso );

Se il file è dovuto aLeggi fino alla fine del fileAl termine della lettura viene restituito EOF; negli altri casi viene restituito 0;

        ferroFunzione utilizzata perDetermina la fine della lettura del filemotivose o noSi è verificato un errore I/O . Il prototipo è il seguente:

int ferror ( FILE * flusso );

Se il file è dovuto aSi è verificato un errore I/OAl termine della lettura viene restituito un valore diverso da zero; negli altri casi viene restituito 0;

Successivamente proviamo a scrivere un pezzo di codice per giudicare la fine della lettura del file:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int c = 0;
  5. FILE* fp = fopen("test.txt", "r");
  6. if (fp == NULL)
  7. {
  8. perror("fopen");
  9. return 0;
  10. }
  11. while ((c = fgetc(fp)) != EOF)//返回EOF则读取结束
  12. {
  13. putchar(c);
  14. }
  15. //判断读取结束的原因
  16. if (ferror(fp))
  17. puts("I/O错误n");
  18. else if (feof(fp))
  19. puts("文件读取结束n");
  20. fclose(fp);
  21. fp = NULL;
  22. return 0;
  23. }

Riassumere

Oggi abbiamo appreso le operazioni sui file, come aprire e chiudere file, scrivere dati o leggere dati da file, funzioni per regolare i puntatori dei file e determinare la fine della lettura dei file. Se ritieni che ciò che ha detto il blogger sia buono, lascia un piccolo mi piace e grazie per il tuo supporto❤❤❤