1
Arquivos
2
Arquivos
Arquivos são estruturas de dados
organizadas, armazenadas e
manipuladas fora da memória principal,
em dispositivos de memória secundária
(por ex. HD, pen-drives, CDs), sendo
lidos por um programa.
Em C++, o conceito de arquivos é
ampliado para incluir dispositivos de
entrada (teclado, portas de comunicação)
e saída (vídeo, impressora).
3
Entrada e Saída com Arquivos
Um stream é um dispositivo lógico que
representa um arquivo ou dispositivo.
É independente do arquivo ou
dispositivo.
A função que manipula um stream
pode escrever tanto em um arquivo no
disco quanto em algum outro
4
Arquivos
C++ trata arquivos como sendo um
stream – fluxo de caracteres.
cout e cin são exemplos de streams
para dispositivos de saída (stdout) e
entrada (stdin).
Para manipular arquivos como
streams é necessária a inclusão de
uma biblioteca fstream nos programas
em C++.
Arquivo
•
Para manipular arquivos em C++, tem-se
que estipular o tipo do fluxo, definir uma
variável que irá manipular esse fluxo e
associar um arquivo com a variável, por
meio de uma função open.
–
ifstream - Indica que é um fluxo de
entrada — input filestream;
–
ofstream - Indica que é um fluxo de saída
— output filestream.
Arquivo
•
Sintaxe:
<Tipo de Fluxo> variavel;
Arquivo
/*ProgC085.cpp - Programa Exemplo Arquivo*/
#include<fstream>
#include<iostream>
using namespace std;
int main(){
ofstream fout;
fout.open("arquivo.txt");
if (fout.is_open()) {
fout<<"Ser ou nao ser...\nEis a questao...\n\nWilliam Shakeaspare\n";
fout.close();
}
else {
cout << "arquivo.txt nao pode ser aberto.\n";
}
return 0;}
Biblioteca para arquivo
Variável arquivo. Controla o fluxo de saída
Associa o arquivo ao fluxo de saída
Verifica se o arquivo pode ser criado
Direciona os caracteres para
o fluxo de saída.
Fecha o fluxo de saída.
Caso haja algum erro para
abrir o arquivo para escrita.
Arquivo
/*ProgC086.cpp - Programa para leitura de Arquivo*/ #include<fstream> #include<iostream> using namespace std; int main() { ifstream fin; char buff[255]; fin.open("arquivo.txt"); if (fin.is_open()) { while(!fin.eof()) { fin.getline(buff, 255); cout << buff << "\n"; } fin.close(); } else {
cout << "arquivo.txt nao pode ser aberto.\n"; } return 0;}
Variável para fluxo de entrada
Variável para receber linha do arquivo.
Associa arquivo ao fluxo de entrada
Verifica se arquivo pode ser aberto para leitura.
Enquanto não atingir o final do arquivo.
Biblioteca para arquivo
Imprime linha do arquivo.
Lê linha do arquivo, máximo de 255 caracteres
Fecha o arquivo.
9
Entrada e Saída com Arquivos
Um arquivo é desassociado de um
stream por meio de uma operação de
fechamento.
Se um arquivo aberto para saída for
fechado, o conteúdo de sua stream
será escrito no dispositivo externo.
Esse processo é geralmente chamado
de descarga (flushing) da stream e
garante que nenhuma informação seja
acidentalmente deixada no buffer de
disco.
Arquivos Textuais
•
Um arquivo textual consiste de
caracteres alfanuméricos, sinais de
pontuação e de símbolos existentes
no teclado.
•
Arquivo com extensões de arquivos txt
e html são exemplos de arquivos
textuais.
Arquivos Textuais – Gravação
de Caracteres
/*ProgC087.cpp - arquivo Texto - Gravação*/
#include<cstdio>
#include<fstream>
#include<iostream>
using namespace std;
int main(){
char nomeArquivo[81];
char ch = 0;
cout << "Nome do arquivo: ";
gets(nomeArquivo);
ofstream ofs;
ofs.open(nomeArquivo);
Biblioteca para arquivo
Nome do Arquivo
Pega nome do
do teclado
if(ofs.is_open()) {
while(ch != '.') {
ch = cin.get();
ofs.put(ch);
}
ofs.close();
}
else {
cout << "ERRO: O arquivo "
<< nomeArquivo
<< " nao pode ser aberto.\n"; }
return 0; }
Fluxo de saída
Abertura do
arquivo
Conseguiu abrir
arquivo
Enquanto ch
diferente de .
Leitura de ch
Coloca ch no
arquivo
Fecha arquivo
Não consegue
abrir o arquivo
Arquivos Textuais – Leitura de
Caracteres
/*ProgC088.cpp - Leitura de Caracteres*/ #include<cstdio> #include<fstream> #include<iostream> using namespace std;
int main(){
char nomeArquivo[81];
char caractere;
int contaC;
int contaL;
cout << "Nome do arquivo: ";
gets(nomeArquivo);
ifstream ifs;
ifs.open(nomeArquivo);
if (ifs.is_open()) {
contaC = 0; contaL = 1;
while(ifs.good()) {
caractere = (char) ifs.get();
cout << caractere;
if (caractere=='\n') contaL++;
ContaC++;}
cout<<endl<<"# linhas = "<<contaL<< endl; cout << "# caracteres = " << contaC << endl;
ifs.close(); }
else {
cout<< "ERRO: O arquivo " << nomeArquivo << " nao pode ser aberto.\n";
}
return 0; }
Nome do Arquivo
Pega nome do
do teclado
Fluxo de entrada
Abertura do
arquivo
Conseguiu abrir
arquivo
Enquanto
não é fim de
arquivo
Pega caractere
do arquivo
Se quebra de linha
Fecha arquivo
Não consegue
abrir o arquivo
Arquivos Textuais – Gravação
de Registro – Com Funções
/*ProgC089.cpp - Registros e Funções*/
#include <cstdio>
#include <fstream>
#include <iostream>
using namespace std;
struct Funcionario {
int codigo; char nome[81];
float salario; char sexo;};
void leNomeArquivo(char nomeArquivo[]){
cout << "Nome do arquivo: ";
fflush(stdin); gets(nomeArquivo);}
void leFuncionario(Funcionario &f){
cout<<"Leitura de dados de um
funcionario\n\n";
cout << "Codigo.: "; cin >> f.codigo;
cout<<"Nome: "; fflush(stdin); gets(f.nome);
cout << "Salario: "; cin >> f.salario;
cout << "Sexo...: "; cin >> f.sexo; }
bool abrirArquivo(ofstream &ofs, char
nomeArquivo[]) {
ofs.open(nomeArquivo);
return ofs.is_open(); }
void gravaFuncionario(ofstream &ofs,
Funcionario &f) {
ofs<<f.codigo<<endl; ofs << f.nome << endl;
ofs<<f.salario<<endl; ofs << f.sexo << endl; }
int main() {
char nomeArquivo[81];
Funcionario funcionario;
ofstream ofs;
leFuncionario(funcionario);
leNomeArquivo(nomeArquivo);
if(abrirArquivo(ofs, nomeArquivo) == true) {
gravaFuncionario(ofs, funcionario); }
else {
cout<<"Arquivo: "<<nomeArquivo
<<" nao pode ser aberto para escrita.\n";}
return 0; }
Registro
Pega nome do
do teclado
True se
arquivo aberto
Le registro
Grava registro
no arquivo
Fluxo de saída
Chamadas
das funções
Arquivos Textuais – Leitura de
Registro – Com Funções
/*ProgC090.cpp - Leitura de registro*/ #include <cstdio> #include <cstring> #include <fstream> #include <iostream> using namespace std; struct Funcionario {
int codigo; char nome[81]; float salario; char sexo; };
void leNomeArquivo(char nomeArquivo[]) { cout << "Nome do arquivo: ";
fflush(stdin); gets(nomeArquivo); } void mostraFuncionario(Funcionario f) {
cout << "Leitura de dados de um funcionario\n\n"; cout << "Codigo.: " << f.codigo << endl;
cout << "Nome...: " << f.nome << endl; cout << "Salario: " << f.salario << endl; cout << "Sexo...: " << f.sexo << endl; }
bool abrirArquivo(ifstream &ifs, char nomeArquivo[]) {
ifs.open(nomeArquivo); return ifs.is_open(); }
void leFuncionario(ifstream &ifs, Funcionario &f) {
ifs >> f.codigo; ifs >> f.nome; ifs >> f.salario; ifs >> f.sexo; } int main() {
char nomeArquivo[81]; Funcionario funcionario; ifstream ifs;
leNomeArquivo(nomeArquivo);
if(abrirArquivo(ifs, nomeArquivo) == true) { // lê as informações do arquivo
leFuncionario(ifs, funcionario);
// mostra os dados de um funcionário mostraFuncionario(funcionario); } else {
cout << "Arquivo: " << nomeArquivo << " nao pode ser aberto para escrita.\n"; } return 0; }
Registro
Pega nome do
do teclado
True se
arquivo aberto
Mostra registro
Le registro
do arquivo
Fluxo de entrada
Chamadas
das funções
Arquivos Textuais – Gravação
de Registros – Com Funções
/*ProgC091.cpp - Vários registros*/ #include <cstdio>
#include <fstream> #include <iostream> using namespace std;
const int MAX_FUNCS = 2; struct Funcionario {
int codigo; char nome[81]; float salario; char sexo;}; void leNomeArquivo (char nomeArquivo []){
cout << "Nome do arquivo: "; fflush(stdin); gets(nomeArquivo); }
void leFuncionario(Funcionario f[MAX_FUNCS]) { for (int i = 0; i < MAX_FUNCS; i++) {
cout << "Leitura de dados de um funcionario\n\n"; cout << "Codigo.: "; cin >> f[i].codigo;
cout << "Nome...: "; fflush(stdin); gets(f[i].nome); cout << "Salario: "; cin >> f[i].salario;
cout << "Sexo...: "; cin >> f[i].sexo; } }
bool abrirArquivo(ofstream &ofs, char nomeArquivo[]) { ofs.open(nomeArquivo);
return ofs.is_open(); }
void gravaFuncionario(ofstream &ofs, Funcionario f[MAX_FUNCS]) {
for (int i = 0; i < MAX_FUNCS; i++) {
ofs << f[i].codigo << endl; ofs << f[i].nome << endl; ofs << f[i].salario << endl; ofs << f[i].sexo << endl;}} int main() { char nomeArquivo[81]; Funcionario funcionarios[MAX_FUNCS]; ofstream ofs; leFuncionario(funcionarios); leNomeArquivo(nomeArquivo);
if(abrirArquivo(ofs, nomeArquivo) == true) { // grava informações no arquivo
gravaFuncionario(ofs, funcionarios); } else {
cout << "Arquivo: " << nomeArquivo
<< " nao pode ser aberto para escrita.\n"; } return 0; }
Registro
Pega nome do
do teclado
True se
arquivo aberto
Le registro
Grava registro
no arquivo
Fluxo de saída
Chamadas
das funções
Arquivos Textuais – Leitura de
Registros – Com Funções
/*ProgC092.cpp - Leitura de registros*/ #include <cstdio>
#include <cstring> #include <fstream> #include <iostream> using namespace std;
const int MAX_FUNCS = 2; struct Funcionario {
int codigo; char nome[81]; float salario; char sexo; };
void leNomeArquivo(char nomeArquivo[]) { cout << "Nome do arquivo: ";
fflush(stdin); gets(nomeArquivo); } void mostraFuncionario(Funcionario f[MAX_FUNCS]) {
for (int i = 0; i < MAX_FUNCS; i++) {
cout<<"Leitura de dados de funcionario\n\n"; cout << "Codigo.: " << f[i].codigo << endl; cout << "Nome...: " << f[i].nome << endl; cout << "Salario: " << f[i].salario << endl; cout << "Sexo...: " << f[i].sexo << endl; } }
bool abrirArquivo(ifstream &ifs, char nomeArquivo[]) {
ifs.open(nomeArquivo); return ifs.is_open(); }
void leFuncionario(ifstream &ifs, Funcionario f[MAX_FUNCS]) {
char buff[81];
for (int i = 0; i < MAX_FUNCS; i++) { ifs >> f[i].codigo; ifs >> f[i].nome; ifs >> f[i].salario; ifs >> f[i].sexo; } } int main() {
char nomeArquivo[81];
Funcionario funcionarios[MAX_FUNCS]; ifstream ifs;
leNomeArquivo(nomeArquivo);
if(abrirArquivo(ifs, nomeArquivo) == true) { leFuncionario(ifs, funcionarios);
mostraFuncionario(funcionarios); } else {
cout << "Arquivo: " << nomeArquivo
<< " nao pode ser aberto para escrita.\n"; } return 0; }
Registro
Pega nome do
do teclado
True se
arquivo aberto
Mostra registros
Le registro
do arquivo
Fluxo de entrada
Chamadas
das funções
Arquivos Binários
•
Arquivos binários são formados por
sequências de bytes ou
agrupamentos ordenados de 8 bits.
•
Quando cria-se um formato de arquivo
para um programa, o programador
arranja os bytes em um formato que
armazena as informações necessárias
para a aplicação.
Arquivos Binários
•
Formatos de arquivos binários incluem
múltiplos tipos de dados no mesmo arquivo,
tais como: dados de imagem, vídeo e
áudio.
•
Um arquivo binário, comumente, possui um
cabeçalho (header) no qual constam
informações essenciais para que os
programas possam ler os dados gravados
após o cabeçalho denominado body.
Arquivos Binários
•
Para manipular arquivos-binários em C/
C++ é necessário estipular o tipo do
fluxo, definir uma variável que irá
manipular esse fluxo e associar um
arquivo com a variável, por meio de
uma função open.
•
Por fim, após o nome do arquivo a ser
Arquivo Binário
•
Sintaxe:
<Tipo de Fluxo> variavel;
Arquivo Binário - Gravação
/*ProgC093.cpp - Grava arquivo binário*/ #include <fstream>
#include <iostream> using namespace std;
const int MAX_FUNCS = 3; struct Funcionario {
int codigo; char nome[81]; float salario; char sexo; }; void leNomeArquivo(char nomeArquivo[]) {
cout << "Nome do arquivo: "; fflush(stdin); gets(nomeArquivo); }
void leFuncionario(Funcionario f[], int quantidade) { for (int i = 0; i < quantidade; i++) {
cout << "Leitura de dados de um funcionario\n\n"; cout << "Codigo.: "; cin >> f[i].codigo;
cout << "Nome...: "; fflush(stdin); gets(f[i].nome); cout << "Salario: "; cin >> f[i].salario;
cout << "Sexo...: "; cin >> f[i].sexo; } }
bool abrirArquivo(ofstream &ofs, char nomeArquivo[]) { ofs.open(nomeArquivo, ios::binary);
return ofs.is_open(); }
void gravaFuncionario(ofstream &ofs, Funcionario f[], int quantidade) {
ofs.write((char*)&quantidade, sizeof(int)); for (int i = 0; i < quantidade; i++)
ofs.write((char*)&f[i], sizeof(f[i])); } int main() { char nomeArquivo[81]; Funcionario funcionarios[MAX_FUNCS]; ofstream ofs; leFuncionario(funcionarios, MAX_FUNCS); leNomeArquivo(nomeArquivo);
if(abrirArquivo(ofs, nomeArquivo) == true) { gravaFuncionario(ofs, funcionarios, MAX_FUNCS);
ofs.close(); } else {
cout << "Arquivo: " << nomeArquivo
<< " nao pode ser aberto para escrita.\n"; } return 0; }
Registro
Pega nome do
do teclado
True se arquivo
binário aberto
Le registro
Grava registro
no arquivo
Fluxo de saída
Chamadas
das funções
Arquivo Binário - Leitura
/*ProgC094.cpp - Leitura arquivvo Binário*/ #include <fstream>
#include <iostream> using namespace std;
const int MAX_FUNCS = 3; struct Funcionario {
int codigo; char nome[81]; float salario; char sexo;}; void leNomeArquivo(char nomeArquivo[]) {
cout << "Nome do arquivo: "; fflush(stdin); gets(nomeArquivo); }
void mostraFuncionario(Funcionario f[], int quantidade) { for (int i = 0; i < quantidade; i++) {
cout << "Leitura de dados de um funcionario\n\n"; cout << "Codigo.: " << f[i].codigo << endl;
cout << "Nome...: " << f[i].nome << endl; cout << "Salario: " << f[i].salario << endl; cout << "Sexo...: " << f[i].sexo << endl; } }
bool abrirArquivo(ifstream &ifs, char nomeArquivo[]) { ifs.open(nomeArquivo, ios::binary);
return ifs.is_open(); }
void leFuncionario(ifstream &ifs, Funcionario f[], int &quantidade) {
ifs.read((char*)&quantidade, sizeof(int)); for (int i = 0; i < quantidade; i++)
ifs.read((char*)&f[i], sizeof(f[i])); } int main() { char nomeArquivo[81]; Funcionario funcionarios[MAX_FUNCS]; ifstream ifs; leNomeArquivo(nomeArquivo);
if(abrirArquivo(ifs, nomeArquivo) == true) { int quantidade = 0;
leFuncionario(ifs, funcionarios, quantidade); mostraFuncionario(funcionarios, quantidade); ifs.close(); }
else {
cout << "Arquivo: " << nomeArquivo
<< " nao pode ser aberto para escrita.\n"; } return 0; }