Prévia do material em texto
4ºAula
Manipulação de arquivos do
tipo texto
Objetivos de aprendizagem
Ao término desta aula, vocês serão capazes de:
criar arquivos através da linguagem de programação;
realizar leitura e escrita em arquivos criados.
Olá, caros(as) alunos(as),
Nesta aula, vamos apreender como os arquivos de dados
são criados, atualizados e utilizados na linguagem C++.
Veremos técnicas de como manipular arquivos através da
linguagem de programação C++. Veremos que para manipular
arquivos em C++ utilizamos uma biblioteca que nos permite
utilizar métodos bem semelhantes aos utilizados na leitura e
escrita de tela.
Bons estudos!
151
Linguagem de programação II 26
1. Manipulação de arquivos do tipo texto
2. Biblioteca fstream
3. Modo de abertura
Armazenar dados em variáveis é guardar dados de forma
temporária, ou seja, ao término da execução do programa
os dados deixam de existir, já que ficam na memória. Para o
armazenamento permanente dos dados de uma aplicação, é
necessária a utilização de uma estrutura que guarde esses dados
em lugar permanente, ou seja, em disco ou fitas, que podem
ser através de banco de dados ou arquivos (DEITEL, 2012).
Existem dois tipos de streams: sequência de bytes de dados
e caracteres em C/C++:
Texto que é composto apenas de caracteres com
no máximo 255 caracteres por linhas. Cada linha é
finalizada pelo caractere \0 (fim de linha).
Binário que é qualquer tipo de dado, incluindo texto.
Por exemplo, no modo texto, a combinação dos
caracteres correspondentes ao carriage return (CR) e
line feed (LF) em um arquivo são interpretados como
um “\n” ao imprimir na tela. Já um arquivo binário,
não recebe tratamento específico, sendo impresso os
caracteres “especiais” como parte da mesma linha
(BARANAUSKAS, 2006).
Como vimos na aula 2, a linguagem C++ possui um
conjunto grande de bibliotecas que, por sua vez, possuem
inúmeras funções que nos auxiliam na programação, portanto,
utilizaremos uma biblioteca da linguagem que nos oferece
uma maneira rápida e eficiente de trabalhar com arquivos. A
biblioteca do C++ é uma das mudanças em relação ao modelo
trabalhado na sua antecessora, utilizaremos uma biblioteca
que nos permite a leitura e escrita de forma semelhante ao cin
cout oferecida pela biblioteca . A biblioteca que
nos permite realizar essa manipulação de stream é a
(BARANAUSKAS, 2006).
2 - A biblioteca fstream
Sempre que é necessária a utilização de um recurso oferecido
através de uma biblioteca, precisamos adicionar uma biblioteca
no cabelho de nosso programa. Nesse caso, precisamos
especificar a biblioteca para a manipular os dados de stream. A
biblioteca responsável por essa manipulação de arquivos é a de
“fstream”, de “file stream” (fluxo de arquivos) (GARCIA,
2011):
As duas contém funções que trabalham com entrada
e saída de dados. No entanto, a biblioteca iostream trabalha
Seções de estudo
1 - Manipulação de arquivos do tipo
texto
apenas com o fluxo de dados via monitor/teclado/periféricos,
enquanto que a biblioteca fstream trabalha com o fluxo de
dados de arquivos (TREVELLIN, 2007).
2.1 - Os objetos de fstream
Uma vez adicionada a biblioteca, podemos criar objetos
em nossos programas que servirão de intermediários entre
o programa e os arquivos manipulados. A biblioteca fstream
define três tipos de objetos para esta função, cada um com
objetivo definido (GARCIA, 2011):
ofstream: objetos que escrevem dados em um arquivo.
ifstream: objetos que leem dados em um arquivo.
fstream: objetos que podem tanto ler como escrever
em um arquivo.
2.2 - Escrevendo em um arquivo
Podemos definir as etapas para criarmos e escrevermos
em um arquivo através da linguagem C++:
Primeiramente, devemos criar objeto do tipo ofstream.
Logo depois, precisamos associar este objeto com um arquivo
e utilizar o objeto para enviar dados para o arquivo, de forma
bem parecida como usamos o comando cout. A diferença é
que os dados vão para o arquivo, ao invés de serem exibidos na
tela (DEITEL, 2012).
A criação de um objeto para manipulação de arquivo é
igual a uma declaração de variável. Primeiramente, declaramos
seu tipo e, em seguida, o nome da variável, sendo assim
podemos definir um objeto de ofstream da seguinte maneira:
Ou seja:
No código acima, criamos um objeto do tipo ofstream
chamado de escreve. Esse objeto agora é capaz de escrever
em arquivos armazenado em disco. No entanto, ainda não
definimos nenhum arquivo a esse objeto, portanto, devemos
associar este objeto a um arquivo. Para isso, utilizaremos a
função open( ), para abrir um arquivo desejado ou criar um
arquivo em disco (TREVELLIN, 2007). Por exemplo, vamos
utilizar o objeto “escreve” para criar um arquivo chamado
“texto.txt”. Para realizar esta tarefa, devemos escrever o
seguinte comando
Ao utilizarmos esse comando, estamos associando nosso
objeto escreve ao arquivo texto.txt. Lembrando que a função
open pode abrir um arquivo existente ou criar um, caso não
exista.
Após a abertura do arquivo é possível escrever dados
dentro dele de maneira bem simples, muito parecido com
a utilização do método cout na escrita em tela. Portanto,
da mesma forma que escreveríamos com o comando cout
utilizando textos ou variáveis do tipo char, strings, int, ou
qualquer outro tipo variável. Também podemos utilizar todos
esses recursos com o objeto do tipo ofstream, com a diferença
que estas informações serão gravadas em um arquivo. O
152
27
exemplo a seguir apresenta um modelo de utilização do ofstream
através do objeto “escreve” para escrever diversos dados em
um arquivo (TREVELLIN, 2007).
#include
#include
using namespace std;
int main()
{
string frase;
coutpossíveis
erros. No código a seguir é exemplificado um modelo de código
que deve ser utilizado em qualquer programa de computador
que desejamos realizar leitura ou escrita em arquivos. No
código abaixo é apresentado um exemplo de validar um
possível erro na abertura do arquivo, ou seja, é verificado se
o objeto responsável pela escrita ou leitura conseguiu abrir o
arquivo. Caso um erro seja encontrado, o programa indica que
o arquivo não pode ser aberto e a execução é terminada. Caso
contrário, o programa continua sua execução normalmente
(TREVELLIN, 2007).
if(!escreve.is_open( ))
{
cout
#include
#include
using namespace std;
int main()
{
char letra;
ifstream leitura;
leitura.open(“texto.txt”);
if(!leitura.is_open( ))
{
cout
#include
#include
154
29
using namespace std;
int main()
{
char vetor[300];
ifstream leitura;
leitura.open(“texto.txt”);
if(!leitura.is_open( ))
{
cout
#include
#include
using namespace std;
int main()
{
string texto;
ifstream leitura;
leitura.open(“texto.txt”);
if(!leitura.is_open( ))
{
couta leitura de
todos os caracteres até o fim de arquivo, incluindo inclusive
quebras de linha. Enquanto o método getline utiliza as quebras
de linha para determinar o fim de sua leitura, descartando
assim a leitura delas.
Se voltarmos e analisarmos os dois exemplos anteriores,
vamos verificar que na abordagem utilizando o método get
não houve necessidade de adicionar o \n para controle de
quebra de linha, enquanto na abordagem com o getline, tanto
para string como para vetor de caractere houve necessidade
de inserir o \n na impressão dos dados. Não podemos definir
essa diferença nem como boa ou ruim, simplesmente é uma
característica de cada método. No entanto, é preciso ter em
mente que cada acesso de um objeto fstream a um arquivo tem
um custo de processamento, ou seja, para um arquivo grande
com centenas de linhas, logo vamos ter milhares de caracteres,
o que significa que o método get acessará muito mais vezes
o mesmo arquivo do que o método getline (TREVELLIN,
2007).
3 - Modos de Arquivo
Quando abrimos um arquivo, podemos querer fazer
diferentes coisas com o conteúdo deste arquivo. Podemos
querer continuar a escrever no fim do arquivo, dando
continuidade aos dados já escritos nele. Podemos querer apagar
todos os dados já escritos e começar do zero novamente. Os
modos de arquivo servem justamente para isto: para definir
como deve ser o comportamento de um arquivo quando
acessado pelo programa. Podemos definir que o arquivo será
utilizado somente para leitura ou somente escrita, se será
utilizado para anexar dados ou se será reescrito totalmente.
Definimos o modo do arquivo quando abrimos ele com um
objeto, adicionando um parâmetro novo ao método open.
Vejam a sintaxe a seguir (TREVELLIN, 2007):
ou
A tabela a seguir resume os modos de arquivo disponíveis
em C++.
Ao abrirmos um arquivo por um objeto ofstream não
há necessidade de definir um modo de arquivo ofstream::out,
já que este modo já é definido para este tipo de objeto. O
155
Linguagem de programação II 30
mesmo ocorre com o modo ifstream::in e os objetos ifstream
(TREVELLIN, 2007).
Além disso, por definição, um arquivo aberto por um
objeto ofstream irá truncar os dados já existentes no arquivo,
escrevendo os dados novos “por cima” dos antigos. Porém, o
modo ofstream::app nos permite anexar dados ao final de um
arquivo. O exemplo a seguir utiliza o modo ofstream::app para
criar uma espécie de “agenda” simplificada em um arquivo de
texto (GARCIA, 2011).
#include
#include
#include
using namespace std;
int main()
{
int dia, mes;
string texto;
cout> dia;
cout > mes;
agenda . Ao compararmos
com o exemplo anterior, podemos observar a semelhança
entre eles.
Retomando a aula
1 - Manipulação de arquivos do tipo texto
Na seção 1, vimos que ao declararmos uma variável ou
matriz, nós não guardamos os dados de nosso sistema, ou seja,
eles existem apenas enquanto o programa está em execução.
Também foi apresentado uma forma desses dados existirem
após essa execução, através da manipulação de arquivo na
linguagem C++.
2 - Biblioteca fstream
Na seção 2, estudamos a biblioteca que
oferece recursos para criar ou abrir um arquivo de texto ou
binário, e também oferece funções de escrita e leitura nesses
arquivos, bem semelhantes as da biblioteca .
Sendo assim, ao trabalharmos com a biblioteca
verificamos que ela nos oferece métodos que nos possibilita
trabalhar com arquivos de maneira simples e fácil.
3 - Modo de abertura
Na seção 3, estudamos que podemos definir para qual
finalidade queremos abrir um arquivo, ou seja, podemos definir
tipos de abertura de um arquivo, fato esse que torna ainda
mais fácil a manipulação de arquivos na nossa programação.
ELLIS, Margaret A.; BEAUVOIR, Simone de;
DIAFéRIA, Lourenço. C++ : manual de referência
comentada. Rio de Janeiro: Campus, 1993.
TREVELIN, Enrique Camargo. Apostila de C++;
UNIESP; 2007. FILHO, Cláudio Rogério Carvalho.
Operadores Lógicos Do C++; excript; 2017.
ASCENCIO, Ana Fernanda Gomes; CAMPOS,
Edilene Aparecida Veneruchi de. Fundamentos da programação
de computadores : algoritmos, pascal, C/C++ (padrão ANSI) e
java. 3. ed. São Paulo: Pearson Prentice Hall, 2014.
Vale a pena ler
Manipulação de arquivos em C++. Disponível em:
. Acesso em: 24 de ago. de 2018.
Entrada de dados 2. Disponível em: . Acesso em: 24
de ago. de 2018.
Vale a pena acessar
Vale a pena
156
31
Dicas de C++ - Leitura e Escrita em Arquivos.
Disponível em: . Acesso em: 21 de ago. de 2018.
Trabalhando com arquivos em Cpp/C++. Disponível
em: . Acesso em: 21 de ago. de 2018.
Vale a pena assistir
Minhas anotações
157