English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Corso di base del linguaggio C

Controllo di flusso del linguaggio C

Funzioni del linguaggio C

Array del linguaggio C

Puntatori del linguaggio C

Stringhe del linguaggio C

Struttura del linguaggio C

File del linguaggio C

Altri C

Manuale di riferimento del linguaggio C

Scrittura e lettura di file del linguaggio C

In questo tutorial, imparerai come gestire i file in C. Imparerai a utilizzare fprintf(), fscanf(), fread(), fwrite(), fseek() e altri per gestire l'I/O standard in C.

I file sono contenitori utilizzati nei dispositivi di archiviazione dei computer per memorizzare dati.

Perché ci servono i file?

  • Quando il programma termina, tutti i dati vengono persi. Anche se il programma termina, i dati memorizzati nel file vengono conservati.

  • Se devi inserire una grande quantità di dati, ci vorrà molto tempo per inserirli tutti.
    Ma se hai un file che contiene tutti i dati, puoi accedere facilmente al contenuto del file utilizzando alcuni comandi di C.

  • Puoi facilmente spostare i dati da un computer all'altro senza alcuna modifica.

Tipi di file

Quando si gestisce un file, è importante conoscere due tipi di file:

  1. File di testo

  2. File binari

1. File di testo

I file di testo sono file comuni.txtFile. Puoi creare facilmente file di testo utilizzando qualsiasi editor di testo semplice (ad esempio, NotePad).

Quando apri questi file, vedrai tutto il contenuto del file in forma di testo. Puoi modificare o eliminare il contenuto facilmente.

Possono essere letti con il minimo lavoro di manutenzione, sono facili da leggere, offrono la sicurezza minima e occupano più spazio di archiviazione.

2. File binari

I file binari sono principalmente utilizzati nei computer..binFile.

Non memorizzano i dati in formato testo puro, ma in formato binario (0 e 1).

Confrontati ai file di testo, possono contenere più dati, sono difficili da leggere e offrono una migliore sicurezza.

Operazioni sui file

In C, puoi eseguire quattro operazioni principali sui file:

  1. Crea un nuovo file

  2. Apri un file esistente

  3. Chiudi il file

  4. Leggi le informazioni e scrivi le informazioni nel file

Gestione del file

Quando si gestisce un file, è necessario dichiarare un puntatore di tipo di file. La comunicazione tra il file e il programma richiede questa dichiarazione.

FILE *fptr;

Apri il file - per creare e modificare

Apri il file utilizzando la funzione fopen() definita nel file di intestazione stdio.h.

La sintassi per aprire un file in I/O standard è:

ptr = fopen("fileopen","mode");

Ad esempio:

fopen("E:\\cprogram\\newprogram.txt","w");
fopen("E:\\cprogram\\oldprogram.bin","rb");
  • Supponiamo che il file newprogram.txt non esista nel percorso E:\cprogram. La prima funzione crea un nuovo file chiamato newprogram.txt e lo configura come follows:'w'Il modello apre il file per la scrittura.
    Il modo di scrittura ti permette di creare e modificare (sovrascrivere) il contenuto dei file.

  • Ora, supponiamo che il secondo file binario oldprogram.bin esista nel percorso E:\cprogram. La seconda funzione apre un file esistente, in modalità binaria'rb'Lettura.
    La modalità di lettura consente di leggere il file ma non di scrivere.

Modi di apertura nel standard I/O
ModiIl significato dei modidurante la mancanza del file
rIn modalitàLetturaModoApri.

Se il file non esiste, fopen() restituisce NULL.

rb

Apri in modalità binaria per leggere.

Se il file non esiste, fopen() restituisce NULL.
wApri il file di testo, consentendo la scrittura del file.

Apri un file di testo, consentendo la scrittura del file. Se il file non esiste, verrà creato un nuovo file.

In questo caso, il tuo programma scriverà il contenuto dal principio del file.

Se il file esiste, verrà troncato a lunghezza zero e ri-scritto.

wb

Apri il file in modalità binaria per scrivere.

Se il file esiste, il suo contenuto verrà sovrascritto.
Se il file non esiste, verrà creato.
aApri per appendere.
I dati vengono aggiunti alla fine del file.

Se il file non esiste, verrà creato.

ab

Apri in modalità binaria per appendere.

I dati vengono aggiunti alla fine del file.

Se il file non esiste, verrà creato.
r+Apri per lettura e scrittura.

Se il file non esiste, fopen() restituisce NULL.

rb+

Apri in modalità binaria per leggere e scrivere.

Se il file non esiste, fopen() restituisce NULL.
w+Apri un file di testo, consentendo la lettura e la scrittura del file

Se il file esiste, il suo contenuto verrà sovrascritto.

Se il file non esiste, verrà creato.

wb+

Apri in modalità binaria per leggere e scrivere.

Se il file esiste, il suo contenuto verrà sovrascritto.
Se il file non esiste, verrà creato.
a+Apri in modalità lettura e appendere.

Se il file non esiste, verrà creato.

ab+

Apri in modalità binaria per leggere e appendere.

Se il file non esiste, verrà creato.

Chiudi il file

Dopo la lettura/scrittura, dovresti chiudere il file (sia file di testo che file binari).

Puoi chiudere il file utilizzando la funzione fclose().

fclose(fptr);

In questo caso, fptr è il puntatore al file associato al file da chiudere.

Lettura e scrittura di file di testo

Per leggere e scrivere file di testo, usiamo le funzioni fprintf() e fscanf().

Sono solo versioni di file di printf() e scanf(). L'unica differenza è che fprint() e fscanf() necessitano di un puntatore alla struttura FILE.

Esempio 1: Scrivi nel file di testo

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int num;
   FILE *fptr;
   // Se stai usando MacOS o Linux, usa il percorso corretto
   fptr = fopen("C:\\program.txt","w");
   if(fptr == NULL)
   {
      printf("Errore!");   
      exit(1);             
   }
   printf("Inserisci num: ");
   scanf("%d",&num);
   fprintf(fptr,"%d",num);
   fclose(fptr);
   return 0;
}

Il programma ottiene un numero dall'utente e lo memorizza nel file program.txt.

Esegui e compila il programma, vedrai che il file di testo program.txt è stato creato nel disco C del computer. Apri il file, vedrai il numero inserito.

Esempio 2: Lettura da file di testo

#include <stdio.h>
#include <stdlib.h>
int main()
{
   int num;
   FILE *fptr;
   if ((fptr = fopen("C:\\program.txt","r")) == NULL){
       printf("Error! opening file");
       // 如果文件指针返回NULL,则程序退出。
       exit(1);
   }
   fscanf(fptr,"%d", &num);
   printf("Valore di n=%d", num);
   fclose(fptr); 
  
   return 0;
}

Questo programma legge l'intero esistente nel file program.txt e lo stampa a schermo.

Se si legge daEsempio 1Il file è stato creato con successo, eseguire questo programma fornirà l'intero immesso.

Altre funzioni come fgetchar(), fputc() e altre possono essere utilizzate in modo simile.

Lettura e scrittura di file binari

In caso di file binari, le funzioni fread() e fwrite() vengono utilizzate rispettivamente per leggere e scrivere file su disco.

Scrittura in file binari

Per scrivere in un file binario, è necessario utilizzare la funzione fwrite(). Queste funzioni accettano quattro parametri:

  1. Indirizzo dei dati da scrivere sul disco

  2. Dimensione dei dati da scrivere sul disco

  3. Numero di dati di questo tipo

  4. Puntatore al file da scrivere.

fwrite(addressData, sizeData, numbersData, pointerToFile);

Esempio 3: Scrittura in file binari utilizzando fwrite()

#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
   int n1, n2, n3;
};
int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;
   if ((fptr = fopen("C:\\program.bin","wb")) == NULL){
       printf("Error! opening file");
       // Se il puntatore di file restituisce NULL, il programma termina.
       exit(1);
   }
   for(n = 1; n < 5; ++n)
   {
      num.n1 = n;
      num.n2 = 5 * n;
      num.n3 = 5 * n + 1;
      fwrite(&num, sizeof(struct threeNum), 1, fptr); 
   }
   fclose(fptr); 
  
   return 0;
}

In questo programma, creiamo un nuovo file program.bin sul disco C.

Decliniamo una struttura threeNum con tre numeri n1, n2 e n3 e la definiamo come num nella funzione principale.

Ora, nel ciclo for, utilizziamo fwrite() per memorizzare i valori nel file.

Il primo parametro accetta l'indirizzo di num, il secondo parametro accetta la dimensione della struttura threeNum.

Poiché inseriamo solo un'istanza di num, il terzo parametro è 1. L'ultimo parametro *fptr punta al file in cui dobbiamo memorizzare i dati.

Infine, chiudiamo il file.

Lettura da file binari

La funzione fread() utilizza anche quattro parametri simili a quelli della funzione fwrite() menzionata sopra.

fread(addressData, sizeData, numbersData, pointerToFile);

Esempio 4: Lettura da file binari utilizzando fread()

#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
   int n1, n2, n3;
};
int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;
   if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
       printf("Error! opening file");
       // 如果文件指针返回NULL,则程序退出。
       exit(1);
   }
   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d", num.n1, num.n2, num.n3);
   }
   fclose(fptr); 
  
   return 0;
}

在此程序中,您读取相同的文件program.bin,并逐个循环浏览记录。

简单来说,您将从*fptr指向的文件中读取一个threeNum大小的threeNum*fptrnum记录到num结构中。

您将获得与示例3中插入的记录相同的记录。

使用fseek()获取数据

如果文件中有很多记录,并且需要访问特定位置的记录,则需要遍历所有记录才能获取该记录。

这将浪费大量的内存和操作时间。使用fseek()可以轻松获得所需数据。

顾名思义,fseek()将光标定位到文件中的给定记录。

fseek()的语法

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

第一个参数流是指向文件的指针。第二个参数是要查找的记录的位置,第三个参数指定偏移量开始的位置。

fseek()中的不同位置
位置含义
SEEK_SET从文件开头开始偏移。
SEEK_END

从文件的末尾开始偏移。

SEEK_CUR

从文件中光标的当前位置开始偏移。

示例5:fseek()

#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
   int n1, n2, n3;
};
int main()
{
   int n;
   struct threeNum num;
   FILE *fptr;
   if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
       printf("Error! opening file");
       // 如果文件指针返回NULL,则程序退出。
       exit(1);
   }
   
   // 将光标移到文件末尾
   fseek(fptr, -sizeof(struct threeNum), SEEK_END);
   for(n = 1; n < 5; ++n)
   {
      fread(&num, sizeof(struct threeNum), 1, fptr); 
      printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
      fseek(fptr, -2 * sizeof(struct threeNum), SEEK_CUR);
   }
   fclose(fptr); 
  
   return 0;
}

Il programma inizierà a leggere e stampare le registrazioni in ordine inverso (dall'ultimo al primo) dal file program.bin.