Escolar Documentos
Profissional Documentos
Cultura Documentos
Arquivos de Texto em C/C++
Arquivos de Texto em C/C++
base
leitura
get()
getline()
read()
gravao
istream
>>
stream
(memria)
ostream
<<
ifstream
(arquivo)
ofstream
(arquivo)
put()
write()
ostrstream
(memria)
istream_whitassign
(entrada padro)
ostream_withassign
(sada padro)
cin
cout
iostream
fstream
(arquivo)
strstream
(memria)
stdiostream
(padro)
char ch;
while(fin.get(ch))
cout << ch;
}
Gravando uma linha no arquivo :
#include <fstream.h>
void main()
{
ofstream fout("a:teste1.txt"); // Cria arquivo para gravao
//em modo texto
fout << "Texto gravado no arquivo por meio de programa C++";
Lendo uma linha do arquivo e exibindo no vdeo:
#include <fstream.h>
void main()
{
const int MAX=80;
char buff[MAX];
ifstream fin("a:teste1.txt");
Descrio
Abre para leitura (default de ifstream).
Abre para gravao (default de ofstream),
Abre e posiciona no final do arquivo.
(Este modo trabalha com leitura e gravao)
Grava a partir do fim do arquivo
Abre e apaga todo o contedo do arquivo
Erro de abertura se o arquivo no existe
Erro de abertura se o arquivo existir
Abre em binrio (default texto)
exit(1);
}
fin.open(argv[1]);
ofstream fout("a:lista.dat");
Livro li;
do
{
li.novonome();
// l do teclado
fout.write((char *)&li, sizeof(Livro)); // grava no arquivo
cout << "\nInserir outro livro (s/n) ";
}while(getche( ) == 's');
}
A funo write( ) recebe dois argumentos: o endereo do objeto a ser gravado e
o tamanho do objeto em bytes.
Lendo um objeto do arquivo :
#include <fstream.h>
#include <stdio.h>
class Livro
{
private :
char titulo[50];
char autor[50];
int numreg;
double preco;
public :
void print();
};
void Livro::print()
{
cout << "\nTitulo : " << titulo;
cout << "\nAutor : " << autor;
cout << "\nNumero do Registro : " << numreg;
cout << "\nPreco : " << preco;
}
void main()
{
ifstream fin("a:lista.dat");
// abre arquivo para leitura
Livro li;
while(fin)
// enquanto no for fim de arquivo...
{
fin.read((char*)&li,sizeof(Livro));
// l do arquivo
li.print();
// imprime no vdeo
}
}
void main()
{
fstream fio;
// cria objeto de leitura e gravao
Livro li;
// cria objeto Livro
fio.open("a:lista.dat", ios::ate | ios::out | ios::in);
// abre e posiciona no final do arquivo, para operaes de
// gravao e leitura
do
{
li.novonome();
// l do teclado
fio.write((char *)&li, sizeof(Livro)); // grava no arquivo
cout << "\nInserir outro livro (s/n) ";
}while(getche( ) != 'n');
// fim se 'n'
fio.seekg(0);
//coloca ponteiro no inicio do arquivo
cout << "\nLista de Livros do arquivo ";
cout << "\n===========================";
while (fio.read((char *)&li, sizeof(Livro)))
// l do arquivo
li.print();
// imprime no vdeo
}
Operadores bit-a-bit : C++ tem seis operadores que atuam em bits individuais de
variveis, e que sero usados nos prximos exemplos. So eles :
Smbolo
&
|
^
>>
<<
~
Operao
E (AND)
OU (OR)
OU exclusivo (XOR)
Deslocamento direita
Deslocamento esquerda
Complemento (unrio)
Exemplo
unsigned x = 5; 00000000 00000101
unsigned y = 9; 00000000 00001001
z = x & y;
00000000 00000001
z = x | y;
00000000 00001101
z = x ^ y;
00000000 00001100
z = x >> 1;
00000000 00000010
z = x << 1;
00000000 00001010
~x
11111111 111111010
Funo
seekg( )
seekp( )
tellg( )
tellp( )
Descrio
Movimenta a posio atual de leitura (get)
Movimenta a posio atual de gravao (put)
Retorna a posio atual de leitura (em bytes),
a partir do incio do arquivo
Retorna a posio atual de gravao (em bytes),
a partir do incio do arquivo
Condies de erro : Situaes de erro ao tratar com arquivos podem ser analisadas
atravs da palavra (int) de status da classe ios, obtida pela funo rdstate( ). Os bits
individuais do valor encontrado podem ser testados pelo operador AND bit-a-bit (&) e
os seguintes valores enumerados:
!"ios::goodbit
Nenhum bit setado. Sem erros
!"ios::eofbit
Encontrado o fim de arquivo
!"ios::failbit
Erro de leitura ou gravao
!"ios::badbit
Erro irrecupervel
A funo clear( ) de prottipo :
void clear(int status=0);
modifica a palavra de status. Se usada sem argumentos, todos os bits so limpos. Do
contrrio, os bits so setados de acordo com os valores enumerados escolhidos e
combinados pelo operador OR (|). Ex.:
clear (ios::eofbit | ios::failtbit);
Outras funes que retornam o status de um bit individual : good(), eof(), fail(),
bad(). Veja o exemplo:
#include <fstream.h>
void main()
{
ifstream fin;
fin.open("xxx.yyy");
if(!fin)
cout << "\nNao posso abrir arquivo xxx.yyy\n";
else
cout << "\nArquivo aberto com sucesso\n";
cout << "\nrdstate() = " << fin.rdstate();
cout << "\ngood() = " << fin.good();
cout << "\neof() = " << fin.eof();
cout << "\nfail() = " << fin.fail();
cout << "\nbad() = " << fin.bad();
}
Execute e observe a sada.
Lendo e gravando de e para a memria : As classes iostream interagem com a
memria pela mesma sintaxe com a qual interagem com arquivos em disco. Ex.:
#include <strstrea.h>
void main()
{
char buff[200];
ostrstream str(buff, sizeof(buff));
// cria buffer para gravao
str << "Este texto esta sendo gravado diretamente na memoria\n";
str << "por meio de um programa c++\n" << ends;
cout << buff;
// exibe buffer no vdeo
}
Observ. : O manipulador ends acrescenta o terminador \0 .
O prximo exemplo cria buffer para leitura e gravao, manipulado com a
mesma sintaxe de cin e cout :
#include <strstrea.h>
void main()
{
strstream str;
// cria buffer para leitura e gravao
double x, y;
int i;
str << "123.45 67.89 123";
// grava
str >> x;
// l
str >> y;
// l
str >> i;
// l
cout << x << "\n" << y << "\n" << i; // exibe no vdeo
}
Execute e observe a sada.
Sobrecarga dos operadores << e >> : Os objetos stream usam os operadores de
insero (<<) e de extrao (>>) com tipos bsicos. Vamos sobrecarreg-los para que
trabalhem com tipos criados pelo usurio.
O primeiro exemplo sobrecarrega os operadores << e >> para classe string:
#include <iostream.h>
#include <string.h>
const MAX=80;
class string
{
private :
char str[MAX];
public :
string( )
{
string (char s[])
str[0] = '\0'; }
{strcpy(str, s);}
void main( )
{
string s;
cout << "\nL string com cin e imprime com cout ;
cout << \nDigite a string : ";
cin >> s;
cout << s;
}
Observ.: As funes operator<<() e operator>>() devem ser friends da classes
string, visto que os objetos ostream (cout) e istream (cin) aparecem esquerda do
operador. O valor de retorno para que o operador possa ser concatenado e imprima
(leia) vrios objetos de uma nica vez.
O segundo exemplo sobrecarrega os operadores << e >> para classe data
modificada :
#include <iostream.h>
class data
{
private :
int dia, mes, ano;
public :
data() {dia=mes=ano=1;}
data(int d, int m, int a);
friend istream& operator>>(istream& is, data& d);
friend ostream& operator<<(ostream& os, data& d);
};
Descrio
Pula brancos na entrada.
Ajusta a sada esquerda.
Ajusta a sada direita.
Adiciona o caracter de preenchimento do campo aps o sinal
de menos ou indicao de base, mas antes do valor.
Formato decimal para nmeros.
Formato octal para nmeros.
Formato hexadecimal para nmeros.
Imprime a base indicada (0x para hex e 0 para octal).
Fora ponto decimal em valores float e preenche com zeros
direita para completar nmero de casas decimais.
Imprime maisculo de A a F para sada hexadecimal e E para
notao cientfica.
Imprime + para inteiros positivos.
Imprime notao cientfica para float
Imprime ponto decimal em valores float
unitbuf
stdio
fout.put(ch);
}
}
Examine o contedo do arquivo teste2.txt usando um editor.
Criando nossos prprios manipuladores : Podemos criar novos manipuladores para
objetos stream. Por exemplo, se o programa for imprimir vrios nmeros num nico
formato, em vez de escrever o formato em cada instruo de impresso, podemos criar
um manipulador como mostra o programa :
#include <fstream.h>
#include <iomanip.h>
ostream& form(ostream& os)
{
os.fill('*');
return os << setiosflags(ios::fixed)
<< setprecision(2)
<< setw(10);
}
void main()
{
double x=3456.789678, y=9876.543278;
cout << '\n' << form << x << '\n'<< y;
}
Execute e observe a sada.
Exerccios
1) Escreva instrues para:
a) abrir o arquivo ARQ.DOC para gravao em binrio
b) ler um objeto da classe A chamado objA de um objeto de um objeto da classe
ifstream chamado fin.
c) movimentar a posio corrente do objeto fin da classe ifstream 20 bytes acima.
d) obter a posio corrente do objeto fin da classe ifstream.
2) Escreva a funo de sobrecarga do operador >> que tome dados de um objeto da
classe istream e os grave num objeto da classe Facil.
3) Crie um manipulador para objetos ostream que imprima um nmero float num
campo de tamanho 10, trs casas decimais e preenchendo os campos no-ocupados
com bancos.
4) Escreva um programa que imprima um arquivo na tela de 20 em 20 linhas. O
arquivo de entrada deve ser fornecido na linha de comando. A cada impresso de
20 linhas o programa aguarda o pressionamento de uma tecla.
5) Modifique o programa anterior para que aceite mais dois argumentos na linha de
comandos, indicando a primeira e a ltima linha a ser impressa.
Prtica XIII
Escreva um programa que criptografa um arquivo usando o operador de complemento
bit-a-bit (~). Quando o programa executado para um arquivo j criptografado, o
arquivo recomposto e volta ao original.