Escolar Documentos
Profissional Documentos
Cultura Documentos
Programação:
Manipulação de Arquivos
PROF. PROTÁSIO
DEE-UFPB
Canais (fluxo) e Arquivos
2
Canal (stream)
É um mecanismo lógico do sistema de E/S de C que
fornece uma interface entre o programador e os
diversos dispositivos de hardware (teclado, terminal de
vídeo, unidades de disco etc.)
Arquivo
É um mecanismo lógico diretamente relacionado com
o dispositivo de hardware real.
Abstração
iostream
fstream
Exemplo:
cout << "ufpb" << endl;
fout << "ufpb" << endl; // sendo que fout é um
// fluxo de arquivo
Arquivos em C++
11
O C++ visualiza cada arquivos como uma
sequência de bytes
0 1 2 3 4 5 6 7 8 n-1
Acesso aleatório
100 bytes 100 bytes 100 bytes 100 bytes 100 bytes 100 bytes
Acesso sequencial
13
O programa a seguir foi elaborado para que o
arquivo seja estruturado de forma sequencial
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
Função open = abrir arquivo
using namespace std;
Modo de Abertura do Arquivo
int main() { ios::out = arquivo de saída
int numero;
string Nome;
ofstream Saida;
Saida.open("saida.txt", ios::out);
if (!Saida) {
cout << "Arquivo saida.txt nao pode ser aberto" << endl;
abort();
}
cout << "Entre com o numero e nome do aluno\n" << “Digite <Ctrl-Z> para fim de arquivo\n\n-> \n";
while(cin >> numero >> Nome) {
Saida << numero << " " << Nome << "\n"; É true até usuário digitar <Ctrl-Z>
cout << "-> \n";
}
Saida.close();
return 0;
}
É equivalente à
ofstream Saida ("saida.txt", ios::out);
Ou
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
int numero;
string Nome;
ofstream Saida;
Saida.open("saida.txt", ios::out);
if (!Saida) {
cout << "Arquivo saida.txt nao pode ser aberto" << endl;
abort();
}
cout << "Entre com o numero e primeiro nome do aluno\n" << "Digite <Ctrl-Z> para fim de arquivo\n\n-> \n";
cin >> numero >> Nome;
while(! cin.eof()){ // final de dados?
Saida << numero << " " << Nome << '\n';
cout << "-> \n";
cin >> numero >> Nome;
}
Saida.close();
return 0;
}
Exercício
16
Faça um programa que recupere os dados do
arquivos do programa anterior.
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <iomanip>
#include <string>
using namespace std;
int main() {
int numero;
string nome;
ifstream Entrada;
Entrada.open("saida.txt", ios::in);
if (! Entrada)
{ cout << "Arquivo saida.txt nao pode ser aberto" << endl;
abort();
}
cout << "Numero" << " " << "Nome" << endl;
abc123...
10 30 10 30 10 30
caracteres caracteres caracteres caracteres caracteres caracteres
int main() {
int numero;
string nome;
ofstream Entrada;
Entrada.open("saida.txt", ios::out);
if (! Entrada) {
cout << "Arquivo saida.txt nao pode ser aberto" << endl;
abort();
}
cout << "Numero" << " " << "Nome" << endl;
return 0;
}
Preparando um arquivo com acesso aleatório
21
1 Maria Aparecida...............
1..........Maria Aparecida
2 Joao Miguel da Silva e Souza
2..........Joao Souza..
3 Sirineu Sirino
3..........Sirineu Sirino................
Acesso Aleatório
22
Em C++, o acesso aleatório é realziado usando
as funções
seekg( )
Seta a posição do próximo caractere a ser lido pela
stream de entrada.
seekp( )
Seta a posição onde o próximo caractere será inserido
na stream de saída.
Acesso Aleatório
23
seekg( )
seekg (posição);
posição : novo valor absolute relativo à origem
Exemplo
ifstream Entrada("saida.txt", ios::in);
Entrada.seekg(10); // lerá o 10º caractere do arquivo
Exemplo
Entrada.seekg(10, Entrada.beg);
Entrada.seekg(0, Entrada.end);
Acesso Aleatório
24
tellg
Retorna a posição do caractere corrente na stream de
entrada
int length = Entrada.tellg();
tellp
Retorna a posição do caractere corrente na stream de
saída
long pos = Saida.tellp();
Exemplo com tellp e seekp
25
#include <fstream>
int main () {
std::ofstream outfile;
outfile.open ("test.txt");
outfile.close();
int main () {
ifstream Entrada ("test.txt");
if (Entrada) {
// Computar o comprimento do arquivo
Entrada.seekg (0, Entrada.end);
Entrada.close();
delete[] buffer;
}
return 0;
}
Retornando ao arquivo formatado para acesso
aleatório 27
1 Maria Aparecida...............
1..........Maria Aparecida
2 Joao Miguel da Silva e Souza
2..........Joao Souza..
3 Sirineu Sirino
3..........Sirineu Sirino................
Recuperando dados com acesso Aleatório
28
#include <iostream>
#include <fstream>
#include <iomanip> // Para manipuladores de stream: setw, left, etc.
#include <string>
using namespace std;
int main() {
int numero, temp;
string nome;
ifstream Entrada("saida.txt", ios::in);
if (! Entrada) {
cout << "Arquivo saida.txt nao pode ser aberto" << endl;
abort();
}
return 0;
}
Modificando dados com acesso aleatório
#include <iostream> 29
#include <fstream>
#include <iomanip> // Para manipuladores de stream: setw, left, etc.
#include <string>
using namespace std;
int main() {
int numero, posicao;
string nome;
fstream Entrada("saida.txt", ios::in|ios::out);
if (! Entrada) { cout << "Arquivo saida.txt nao pode ser aberto" << endl; abort(); }
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
char *p = "Alô a todos!";
// abre um arquivo para escrita
ofstream out( "Test.txt" );
if( !out )
{
cout << "O arquivo não pode ser aberto!";
return 1;
}
while( *p )
out.put( *p++ );
return 0;
}
Exemplo com get()
32
#include <iostream>
#include <fstream>
int main ( )
{
// declaração das variáveis
char ch; // guarda o caractere lido
return 0;
}
Salvando objetos em arquivo
33
Exemplo: criando o arquivo inicial para salvar
dados de contas bancárias
#include <iostream>
#include <fstream>
struct conta {
int numero;
char nome[30];
float saldo;
};
int main() {
conta contavazia = {0, "", 0.0};
ofstream Sfile("contas.txt",ios::out);
if(! Sfile) { cerr << "Fala em abrir o arquivo!!!" << endl; return 1;
}
return 0;
}
Salvando objetos em arquivo: inserir dados
34
#include <iostream>
#include <fstream>
struct conta
{
int numero;
char nome[30];
float saldo;
};
int main() {
conta c;
ofstream Sfile("contas.txt",ios::ate);
if(! Sfile) { cerr << "Arquivo credito.dat nao pode ser aberto." << endl; return 1; }
int main() {
conta c;
ifstream Sfile("contas.txt", ios::in);
if(! Sfile) { cerr << "Falha em abrir o arquivo!!!" << endl; return 1; }
cout << setiosflags(ios::left) // Comando para setar flags - ios::left = alinhar à esquerda
<< setw(10) << "Conta" // setw(n) lê ou escreve o valor em w caracteres
<< setw(30) << "Nome"
<< resetiosflags(ios::left)// reseta flags ios::left
<< setw(10) << "Saldo" << endl;
Sfile.read((char *)(&c),sizeof(conta));