open vs fopen in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione fopen per aprire o creare un file in C
  2. Usa la funzione open per aprire o creare un file in C
  3. Usa la funzione creat per aprire e creare un file
open vs fopen in C

Questo articolo mostrerà diversi metodi sull’utilizzo delle funzioni open e fopen in C.

Usa la funzione fopen per aprire o creare un file in C

fopen è la funzione della libreria standard C per gestire l’apertura dei file come oggetti stream. In contrasto con la funzione open, che è intrinsecamente una chiamata di sistema, fopen associa l’oggetto puntatore FILE al file dato. Ci vogliono due argomenti; il primo rappresenta un percorso del file da aprire e il secondo argomento la modalità in cui aprire il file.

Notare che fopen ha più valori predefiniti per il parametro mode, tutti dettagliati nel manuale delle funzioni pagina. Nel seguente codice di esempio, specifichiamo la modalità w+, che apre il file per la lettura e la scrittura insieme al troncamento del contenuto e al posizionamento dello stream all’inizio. Si noti che se il percorso della funzione specificato non esiste, la chiamata crea un nuovo file per la scrittura.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  FILE* output_file = fopen(filename, "w+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }
  fwrite(str, 1, strlen(str), output_file);
  printf("Done Writing!\n");

  fclose(output_file);

  exit(EXIT_SUCCESS);
}

Produzione:

Done Writing!

Usa la funzione open per aprire o creare un file in C

Al contrario, la funzione open è essenzialmente un servizio di sistema di livello inferiore chiamato anche quando viene utilizzato fopen. Si noti che le chiamate di sistema vengono solitamente fornite agli utenti finali con funzioni wrapper della libreria C, ma le loro caratteristiche e casi d’uso delle prestazioni differiscono da quelli della libreria C stio. Per esempio. open accetta il secondo argomento come tipo int e il terzo argomento opzionale che specifica i bit di modalità file quando viene creato un nuovo file. Nell’esempio seguente, dimostriamo la funzionalità simile come nel codice di esempio precedente.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_RDWR | O_CREAT);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

La chiamata open crea un nuovo descrittore di file e restituisce il suo valore al chiamante; altrimenti, -1 viene restituito in caso di fallimento e errno viene impostato di conseguenza. Il prossimo esempio di codice mostra la chiamata open con l’argomento modalità opzionale che specifica S_IRWXU. Questi simboli sono macro definite nell’intestazione <fcntl.h> e indicano i diversi flag di autorizzazione del file. S_IRWXU implica che il proprietario del file avrà i permessi di lettura / scrittura / esecuzione su un file appena creato.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_CREAT | O_WRONLY | O_APPEND, S_IRWXU);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

Usa la funzione creat per aprire e creare un file

Un’altra chiamata di sistema inclusa con open è la funzione creat, che può essere usata specificatamente per creare un nuovo file, o se il file esiste già, troncarlo a lunghezza zero. Notare che questa funzione è essenzialmente uguale alla chiamata open con i seguenti argomenti - O_CREAT | O_WRONLY | O_TRUNC. Quindi, richiede solo due argomenti rispetto a open, omettendo il secondo argomento flag.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = creat(filename, S_IRWXG);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Articolo correlato - C File