Programação de computador - E / S de arquivo

Arquivos de computador

Um arquivo de computador é usado para armazenar dados em formato digital, como texto simples, dados de imagem ou qualquer outro conteúdo. Os arquivos do computador podem ser organizados em diferentes diretórios. Os arquivos são usados ​​para manter os dados digitais, enquanto os diretórios são usados ​​para manter os arquivos.

Os arquivos do computador podem ser considerados a contrapartida digital dos documentos em papel. Durante a programação, você mantém seu código-fonte em arquivos de texto com extensões diferentes, por exemplo, arquivos de programação C terminam com a extensão.c, Arquivos de programação Java com .javae arquivos Python com .py.

Entrada / saída de arquivo

Normalmente, você cria arquivos usando editores de texto como notepad, MS Word, MS Excel ou MS Powerpoint, etc. No entanto, muitas vezes, precisamos criar arquivos usando programas de computador também. Podemos modificar um arquivo existente usando um programa de computador.

Entrada de arquivo significa dados que são gravados em um arquivo e saída de arquivo significa dados que são lidos de um arquivo. Na verdade, os termos de entrada e saída estão mais relacionados à entrada e saída da tela. Quando exibimos um resultado na tela, ele é chamado de saída. Da mesma forma, se fornecermos alguma entrada ao nosso programa a partir do prompt de comando, ela será chamada de entrada.

Por enquanto, é suficiente lembrar que escrever em um arquivo é entrada de arquivo e ler algo de um arquivo é saída de arquivo.

Modos de operação de arquivo

Antes de começarmos a trabalhar com qualquer arquivo usando um programa de computador, precisamos criar um novo arquivo se ele não existir ou abrir um arquivo já existente. Em qualquer caso, podemos abrir um arquivo nos seguintes modos -

  • Read-Only Mode- Se você vai apenas ler um arquivo existente e não deseja gravar nenhum conteúdo adicional no arquivo, então você abrirá o arquivo no modo somente leitura. Quase todas as linguagens de programação fornecem sintaxe para abrir arquivos no modo somente leitura.

  • Write-Only Mode- Se você for gravar em um arquivo existente ou em um arquivo recém-criado, mas não quiser ler nenhum conteúdo escrito desse arquivo, abrirá o arquivo no modo somente gravação. Todas as linguagens de programação fornecem sintaxe para abrir arquivos no modo somente gravação.

  • Read & Write Mode - Se você vai ler e escrever no mesmo arquivo, então você abrirá o arquivo no modo de leitura e gravação.

  • Append Mode- Quando você abre um arquivo para gravação, permite que você comece a gravar desde o início do arquivo; no entanto, ele substituirá o conteúdo existente, se houver. Suponha que não desejemos sobrescrever nenhum conteúdo existente, então abrimos o arquivo no modo anexar. O modo Anexar é basicamente um modo de gravação, que permite que o conteúdo seja anexado no final do arquivo. Quase todas as linguagens de programação fornecem sintaxe para abrir arquivos no modo anexar.

Nas seções a seguir, aprenderemos como abrir um novo arquivo, como escrever nele e, posteriormente, como ler e acrescentar mais conteúdo ao mesmo arquivo.

Abrindo arquivos

Você pode usar o fopen()função para criar um novo arquivo ou para abrir um arquivo existente. Esta chamada irá inicializar um objeto do tipoFILE, que contém todas as informações necessárias para controlar o fluxo. Aqui está o protótipo, ou seja, a assinatura desta chamada de função -

FILE *fopen( const char * filename, const char * mode );

Aqui, filename é uma string literal, que você usará para nomear seu arquivo e acessar mode pode ter um dos seguintes valores -

Sr. Não Modo e descrição
1

r

Abre um arquivo de texto existente para fins de leitura.

2

w

Abre um arquivo de texto para escrita. Se não existir, um novo arquivo será criado. Aqui, seu programa começará a escrever o conteúdo desde o início do arquivo.

3

a

Abre um arquivo de texto para escrever no modo de acréscimo. Se não existir, um novo arquivo será criado. Aqui, seu programa começará a anexar conteúdo ao conteúdo do arquivo existente.

4

r+

Abre um arquivo de texto para leitura e escrita.

5

w+

Abre um arquivo de texto para leitura e escrita. Ele primeiro trunca o arquivo para comprimento zero, se existir; caso contrário, cria o arquivo se ele não existir.

6

a+

Abre um arquivo de texto para leitura e escrita. Ele cria um arquivo, se ele não existir. A leitura começará do início, mas a escrita só pode ser anexada.

Fechando um Arquivo

Para fechar um arquivo, use o fclose( )função. O protótipo desta função é -

int fclose( FILE *fp );

o fclose( ) função retorna zero em caso de sucesso, ou EOF, caractere especial, se houver erro no fechamento do arquivo. Na verdade, esta função libera todos os dados ainda pendentes no buffer para o arquivo, fecha o arquivo e libera qualquer memória usada para o arquivo. O EOF é uma constante definida no arquivo de cabeçalhostdio.h.

Existem várias funções fornecidas pela biblioteca padrão C para ler e gravar um arquivo caractere por caractere ou na forma de uma string de comprimento fixo. Vamos ver alguns deles na próxima seção.

Gravando um Arquivo

A seguir está a função mais simples para escrever caracteres individuais em um fluxo -

int fputc( int c, FILE *fp );

A função fputc() escreve o valor do caractere do argumento c no fluxo de saída referenciado por fp. Ele retorna o caractere escrito escrito com sucesso, caso contrárioEOFse houver um erro. Você pode usar as seguintes funções para escrever uma string terminada em null em um stream -

int fputs( const char *s, FILE *fp );

A função fputs() escreve a string sno arquivo referenciado por fp. Ele retorna um valor não negativo em caso de sucesso, caso contrárioEOFé retornado em caso de algum erro. Você também pode usar a funçãoint fprintf(FILE *fp,const char *format, ...)para escrever uma string em um arquivo. Experimente o seguinte exemplo -

#include <stdio.h>

int main() {
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

Quando o código acima é compilado e executado, ele cria um novo arquivo test.txt no /tmpdiretório e escreve duas linhas usando duas funções diferentes. Vamos ler este arquivo na próxima seção.

Lendo um arquivo

A seguir está a função mais simples de ler um arquivo de texto caractere por caractere -

int fgetc( FILE * fp );

o fgetc() função lê um caractere do arquivo de entrada referenciado por fp. O valor de retorno é o caractere lido; ou em caso de algum erro, retornaEOF. A função a seguir permite que você leia uma string de um fluxo -

char *fgets( char *buf, int n, FILE *fp );

A função fgets() lê até n - 1 caracteres do fluxo de entrada referenciado por fp. Ele copia a string lida no bufferbuf, anexando um null caractere para encerrar a string.

Se esta função encontrar um caractere de nova linha '\ n' ou EOF antes de lerem o número máximo de caracteres, ela retornará apenas os caracteres lidos até aquele ponto, incluindo o caractere de nova linha. Você também pode usarint fscanf(FILE *fp, const char *format, ...) para ler strings de um arquivo, mas para de ler depois de encontrar o primeiro caractere de espaço.

#include <stdio.h>

main() {

   FILE *fp;
   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);
}

Quando o código acima é compilado e executado, ele lê o arquivo criado na seção anterior e produz o seguinte resultado -

1 : This
2 : is testing for fprintf...

3 : This is testing for fputs...

Vamos analisar o que aconteceu aqui. Primeiro, ofscanf() método lê Thisporque depois disso, encontrou um espaço. A segunda chamada é parafgets(), que lê a linha restante até encontrar o fim da linha. Finalmente, a última chamadafgets() lê a segunda linha completamente.

E / S de arquivo em Java

Java fornece um conjunto de funções ainda mais rico para lidar com E / S de arquivo. Para saber mais sobre este tópico, sugerimos que você verifique nossos tutoriais Java.

Aqui, veremos um programa Java simples, que é equivalente ao programa C explicado acima. Este programa irá abrir um arquivo de texto, escrever algumas linhas de texto nele e fechar o arquivo. Finalmente, o mesmo arquivo é aberto e lido a partir de um arquivo já criado. Você pode tentar executar o seguinte programa para ver a saída -

import java.io.*;

public class DemoJava {
   public static void main(String []args) throws IOException {
      File file = new File("/tmp/java.txt");
      
      // Create a File
      file.createNewFile();
      
      //  Creates a FileWriter Object using file object
      FileWriter writer = new FileWriter(file); 
      
      // Writes the content to the file
      writer.write("This is testing for Java write...\n");
      writer.write("This is second line...\n");
      
      // Flush the memory and close the file
      writer.flush();
      writer.close();
      
      // Creates a FileReader Object
      FileReader reader = new FileReader(file); 
      char [] a = new char[100];
      
      // Read file content in the array
      reader.read(a);
      System.out.println( a );
      
      // Close the file
      reader.close();
   }
}

Quando o programa acima é executado, ele produz o seguinte resultado -

This is testing for Java write...
This is second line...

E / S de arquivo em Python

O programa a seguir mostra a mesma funcionalidade para abrir um novo arquivo, escrever algum conteúdo nele e, finalmente, ler o mesmo arquivo -

# Create a new file
fo = open("/tmp/python.txt", "w")

# Writes the content to the file
fo.write( "This is testing for Python write...\n");
fo.write( "This is second line...\n");

# Close the file
fo.close()

# Open existing file
fo = open("/tmp/python.txt", "r")

# Read file content in a variable
str = fo.read(100);
print str

# Close opened file
fo.close()

Quando o código acima é executado, ele produz o seguinte resultado -

This is testing for Python write...
This is second line...