cblc/aulas/15-wfiles
2025-05-06 08:26:10 -03:00
..
README.org conteúdo da aula 15 2025-05-06 08:26:10 -03:00

Curso Básico da Linguagem C

Aula 15: Abertura de arquivos para escrita

Vídeo desta aula

Modos de abertura de arquivos

Em relação ao sentido do fluxo de dados, nós podemos realizar duas operações com arquivos abertos: leitura e escrita. Com a função fopen, isso é definido em seu segundo argumento através de uma string de modo:

String Modo Descrição
"r" Leitura Abre o arquivo para leitura a partir de seu início. Se o arquivo não existir, causa um erro.
"w" Escrita Apaga os dados originais do arquivo para escrever novos. Se o arquivo não existir, ele é criado.
"a" Append Abre o arquivo para acrescentar novos dados ao seu final. Se o arquivo não existir, ele é criado.

Na chamada de sistema open, as strings de modo seriam equivalentes às flags:

  • "r": O_RDONLY
  • "w": O_WRONLY | O_CREAT | O_TRUNC
  • "a": O_WRONLY | O_CREAT | O_APPEND

As flags múltiplas são passadas como operações OR bit-a-bit.

Modos complementares

Incluindo o caractere + ao final da string de modo, também será possível realizar a operação oposta:

String Modo Descrição
"r+" Leitura e escrita Posiciona o ponteiro interno no início do arquivo para leitura e escrita. Se o arquivo não existir, causa um erro.
"w+" Escrita e leitura Apaga os dados originais do arquivo para escrever novos e ler o que for escrito. Se o arquivo não existir, ele é criado.
"a+" Append e leitura Posiciona o ponteiro interno no fim do arquivo para leitura e para acrescentar novos dados. Se o arquivo não existir, ele é criado.

Nós voltaremos a este assunto na próxima aula, mas deve ser evidente que precisaremos controlar o ponteiro interno do arquivo para realizar operações de leitura e escrita em um mesmo stream.

Modos texto e binário

Sistemas Unix-like não fazem distinção entre arquivos texto e binários em operações de entrada e saída (I/O). Portanto, o caractere b, que pode ser incluído ao final ou entre os caracteres da string de modo, não terá efeito e só precisaria ser utilizado no caso da possibilidade do programa ser portado para outros sistemas.

Modos de escrita

Em termos gerais, as etapas de trabalho com arquivos abertos para escrita ou append são os mesmos de quando falamos da leitura:

  • Abertura do arquivo para obter um stream;
  • Processamento dos dados;
  • Fechamento do stream.

Abertura de um arquivo para escrita ("w")

Neste exemplo, o arquivo linha.txt será criado (ou truncado, se já existir) para receber uma linha digitada pelo usuário no terminal:

// Abertura do arquivo para escrita...
char *file = "linha.txt";
FILE *stream = fopen(file, "w");
if (!stream) {
    perror("Erro na abertura do arquivo");
    return EXIT_FAILURE;
}

// Processamento...
char line[BUFSIZ];           // Buffer para receber a linha digitada.
fgets(line, BUFSIZ, stdin);  // Lê a digitação no terminal.
fprintf(stream, "%s", line)  // Copia a string no buffer para o arquivo.

// Fechamento do arquivo...
fclose(stream);

Assim, toda vez que o programa for executado, seu conteúdo será substituído pelo que nós digitarmos (exceto na primeira vez, quando o arquivo for criado).

Abertura de um arquivo para append ("a")

Para que o arquivo linha.txt receba novas linhas a cada execução do exemplo anterior, basta trocar a string de modo:

// Abertura do arquivo para append...
char *file = "linha.txt";
FILE *stream = fopen(file, "a");
if (!stream) {
    perror("Erro na abertura do arquivo");
    return EXIT_FAILURE;
}

// Processamento...
char line[BUFSIZ];           // Buffer para receber a linha digitada.
fgets(line, BUFSIZ, stdin);  // Lê a digitação no terminal.
fprintf(stream, "%s", line)  // Copia a string no buffer para o arquivo.

// Fechamento do arquivo...
fclose(stream);

Notas gerais

  • Enquanto o arquivo estiver aberto, nós podemos realizar diversas operações de escrita.
  • No caso do modo "w", o conteúdo anterior do arquivo só será truncado na sua abertura, não a cada escrita com o arquivo já aberto.
  • Toda vez que algo é escrito no arquivo, seu ponteiro interno é posicionado no byte seguinte ao último byte escrito.