• Nenhum resultado encontrado

Bac004 - Parte 10

N/A
N/A
Protected

Academic year: 2021

Share "Bac004 - Parte 10"

Copied!
22
0
0

Texto

(1)

1

Arquivos

(2)

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)

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)

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++.

(5)

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.

(6)

Arquivo

Sintaxe:

<Tipo de Fluxo> variavel;

(7)

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.

(8)

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)

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.

(10)

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.

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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.

(18)

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.

(19)

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

(20)

Arquivo Binário

Sintaxe:

<Tipo de Fluxo> variavel;

(21)

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

(22)

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; }

Registro

Pega nome do

do teclado

True se arquivo

binário aberto

mostra

registro

Le registro do

arquivo

Fluxo de entrada

Chamadas

das funções

Referências

Documentos relacionados

Assim, com o aprofundamento e a apreciação das perspectivas educacionais, esta estratégia não apenas vai contribuir para uma estruturação inter-pessoal

15.6 - Os pedidos de esclarecimentos referentes a este processo licitatório deverão ser enviados ao pregoeiro, até três dias úteis anteriores à data fixada para abertura da

thread corrente em estado de espera até que outra thread chame os métodos notify ou notifyAll liberando o

Diferentemente do prazo fixado para pagamento dos precató- rios, as RPVs são depositadas pelos Tribunais Regionais Federais nos bancos ofi- ciais, mensalmente, obedecido o prazo de

Varr edura TCP Window ( cont inuação) ACK- win manipulado Não Responde ACK- win manipulado ICMP Tipo 3 Firewall Negando Firewall Rejeitando Scanner de Porta... Var r edur a FI N/

Antes de mostrarmos a rela¸ c˜ ao entre regularidade de uma curva e existˆ encia de reparametriza¸c˜ oes por comprimento de arco dessa curva, notemos uma propriedade sim- ples

O Reitor do Instituto Federal de Santa Catarina (IFSC) torna público pelo presente Edital, de acordo com as disposições legais em vigor, o início do período de manifestação de

A comunicação desenvolve o tema de aplicação do conceito gestão do risco precisamente ao risco de gestão dos recursos hídricos, focando os processos de decisão e de