open vs fopen em C

Jinku Hu 12 outubro 2023
  1. Use a função fopen para abrir ou criar um arquivo em C
  2. Use a função open para abrir ou criar um arquivo em C
  3. Use a função creat para abrir e criar um arquivo
open vs fopen em C

Este artigo irá demonstrar vários métodos sobre o uso de funções open vs fopen em C.

Use a função fopen para abrir ou criar um arquivo em C

fopen é a função de biblioteca padrão C para lidar com a abertura de arquivos como objetos de fluxo. Em contraste com a função open, que é intrinsecamente uma chamada de sistema, fopen associa o objeto de ponteiro FILE ao arquivo fornecido. Leva dois argumentos; o primeiro representa um nome de caminho para o arquivo a ser aberto, e o segundo argumento o modo em que o arquivo deve ser aberto.

Observe que fopen tem vários valores predefinidos para o parâmetro de modo, todos os quais são detalhados no manual de funções página. No código de exemplo a seguir, especificamos o modo w+, que abre o arquivo para leitura e gravação junto com o truncamento do conteúdo e o posicionamento do fluxo no início. Observe que, se o caminho de função fornecido não existir, a chamada criará um novo arquivo para gravação.

#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);
}

Resultado:

Done Writing!

Use a função open para abrir ou criar um arquivo em C

Em contraste, a função open é essencialmente um serviço de sistema de nível inferior chamado mesmo quando fopen é usado. Observe que as chamadas do sistema geralmente são fornecidas aos usuários finais com funções de wrapper da biblioteca C, mas suas características e casos de uso de desempenho diferem daqueles na biblioteca C stio. Por exemplo, open recebe o segundo argumento como tipo int e o terceiro argumento opcional especificando bits de modo de arquivo quando um novo arquivo é criado. No exemplo a seguir, demonstramos a funcionalidade semelhante à do código de amostra anterior.

#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);
}

A chamada open cria um novo descritor de arquivo e retorna seu valor para o chamador; caso contrário, -1 é retornado em caso de falha e errno é definido de acordo. O próximo exemplo de código mostra a chamada open com o argumento de modo opcional especificando S_IRWXU. Esses símbolos são macros definidos no cabeçalho <fcntl.h> e denotam os diferentes sinalizadores de permissão do arquivo. S_IRWXU implica que o proprietário do arquivo terá permissões de leitura / gravação / execução em um arquivo recém-criado.

#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);
}

Use a função creat para abrir e criar um arquivo

Outra chamada de sistema incluída com open é a função creat, que pode ser usada especificamente para criar um novo arquivo ou, se o arquivo já existir, truncar para comprimento zero. Observe que esta função é essencialmente igual à chamada open com os seguintes argumentos - O_CREAT | O_WRONLY | O_TRUNC. Assim, leva apenas dois argumentos em comparação com open, omitindo o segundo argumento sinalizadores.

#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);
}
Autor: 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

Artigo relacionado - C File