utilização de ficheiros externos

10
1 programa dados Utilização de ficheiros externos Utilização de ficheiros externos A maneira mais simples de escrever para um ficheiro externo é A maneira mais simples de escrever para um ficheiro externo é redireccionar a saída de um programa: em UNIX redireccionar a saída de um programa: em UNIX ./exec > dados.dat ./exec > dados.dat Mas esta versão é muito limitada. Mas esta versão é muito limitada. Para aceder a um ficheiro externo num programa em Para aceder a um ficheiro externo num programa em C/C++ temos de definir um C/C++ temos de definir um stream stream

Upload: jeneva

Post on 11-Jan-2016

17 views

Category:

Documents


0 download

DESCRIPTION

programa. dados. 11101001001000100 10000100100010010 11111100000100100 10001001000001111. stream. Utilização de ficheiros externos. A maneira mais simples de escrever para um ficheiro externo é redireccionar a saída de um programa: em UNIX ./exec > dados.dat - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Utilização de ficheiros externos

11

programadados

Utilização de ficheiros externosUtilização de ficheiros externos

A maneira mais simples de escrever para um ficheiro externo é A maneira mais simples de escrever para um ficheiro externo é redireccionar a saída de um programa: em UNIXredireccionar a saída de um programa: em UNIX

./exec > dados.dat./exec > dados.dat

Mas esta versão é muito limitada. Mas esta versão é muito limitada.

Para aceder a um ficheiro externo num programa em C/C++ temos Para aceder a um ficheiro externo num programa em C/C++ temos de definir um de definir um streamstream

Page 2: Utilização de ficheiros externos

22

Streams por defeito no C++:Streams por defeito no C++: cout cout : ecrã: ecrã cin cin : teclado: teclado cerr cerr : ecrã, mesmo se a saída tiver sido redireccionada: ecrã, mesmo se a saída tiver sido redireccionada

Tipos:Tipos: ifstreamifstream : leitura : leitura ofstream ofstream : escrita: escrita fstream fstream : escrita ou leitura: escrita ou leitura

Abertura para leitura e escrita:Abertura para leitura e escrita: Em C++:Em C++: fstream InOut(“RW.dat”, fstream::in | fstream::out ); fstream InOut(“RW.dat”, fstream::in | fstream::out ); Em C:Em C: InOut=fopen(“RW.dat”, “r+”);InOut=fopen(“RW.dat”, “r+”);

Utilização de ficheiros externosUtilização de ficheiros externos

Page 3: Utilização de ficheiros externos

33

Versão C:Versão C:

FILE *stream;FILE *stream;

stream = fopen(“ficheiro.dat”, “wt”); stream = fopen(“ficheiro.dat”, “wt”); (“r” para leitura)(“r” para leitura)fprintf(stream, “%d %f\n”, i, x);fprintf(stream, “%d %f\n”, i, x);(ou fscanf....)(ou fscanf....)fclose(stream);fclose(stream);

Para I/O binário usa-se Para I/O binário usa-se freadfread e e fwritefwrite..Streams standard:Streams standard:

stdinstdin (teclado), (teclado), stdoutstdout (ecrã), (ecrã), stderrstderr (ecrã se a saída tiver sido redireccionada para ficheiro) (ecrã se a saída tiver sido redireccionada para ficheiro)

printf printf fprintf(stdout, …); scanf fprintf(stdout, …); scanf fscanf(stdin, …); fscanf(stdin, …);

Utilização de ficheiros externosUtilização de ficheiros externos

Page 4: Utilização de ficheiros externos

44

Versão C++:Versão C++:

#include <fstream>#include <fstream>

ifstream stream; ifstream stream; ifstream para leituraifstream para leitura

stream.open(“dados.dat”);stream.open(“dados.dat”);

stream >> x >> y ;stream >> x >> y ;

dados.close(stream);dados.close(stream);

Pode simplificar-se: ifstream stream(“dados.dat”)Pode simplificar-se: ifstream stream(“dados.dat”)

Utilização de ficheiros externosUtilização de ficheiros externos

Page 5: Utilização de ficheiros externos

55

Comparação C++/C:Comparação C++/C:

Utilização de ficheiros externosUtilização de ficheiros externos

#include <iostream>#include <iostream>

#include <fstream>#include <fstream>

#include <stdlib.h>#include <stdlib.h>

using namespace std;using namespace std;

int main(){int main(){

int i1, i2;int i1, i2;

ifstream dados("dados.dat");ifstream dados("dados.dat");

if(dados.bad()){if(dados.bad()){

cerr << "Impossivel ler o cerr << "Impossivel ler o ficheiro" << endl;ficheiro" << endl;

exit(1);exit(1);

}}

while( dados >> i1 >> i2, !dados.eof() )while( dados >> i1 >> i2, !dados.eof() )

cout << i1 << " " << i2 << endl;cout << i1 << " " << i2 << endl;

return 0;return 0;

}}

#include <stdio.h>#include <stdio.h>

#include <stdlib.h>#include <stdlib.h>

int main(){int main(){

int i1, i2;int i1, i2;

FILE *dados;FILE *dados;

if( !(dados = fopen("dados.dat", "rt") ) ){if( !(dados = fopen("dados.dat", "rt") ) ){

fprintf(stderr, "Impossivel ler o fprintf(stderr, "Impossivel ler o ficheiro\n");ficheiro\n");

exit(1);exit(1);

}}

while( (fscanf(dados, "%d %d", &i1, &i2 )) != while( (fscanf(dados, "%d %d", &i1, &i2 )) != EOF )EOF )

printf("%d %d\n", i1, i2);printf("%d %d\n", i1, i2);

return 0;return 0;

}}

Page 6: Utilização de ficheiros externos

66

Funções (versão C/C++)Funções (versão C/C++)

Passagem de variáveis entre funções:Passagem de variáveis entre funções: ValorValor ReferênciaReferência

Nos dois casos o que é passado para o interior da Nos dois casos o que é passado para o interior da função é uma função é uma cópiacópia do valor da variável apresentada no do valor da variável apresentada no argumento.argumento.

Na passagem por valor é passado o valor contido na Na passagem por valor é passado o valor contido na variávelvariável

Na passagem por referência é passada a localização Na passagem por referência é passada a localização em memória da variávelem memória da variável

A passagem por referência é a mais utilizada quando A passagem por referência é a mais utilizada quando pretendemos passar objectos complexos para dentro pretendemos passar objectos complexos para dentro das funções.das funções.

Page 7: Utilização de ficheiros externos

77

Funções (versão C/C++)Funções (versão C/C++)

Exemplo de passagem por valor:Exemplo de passagem por valor:

Passagem por referência: Passagem por referência:

Page 8: Utilização de ficheiros externos

88

Funções (versão C/C++)Funções (versão C/C++)

Ponteiros a gogo:Ponteiros a gogo:char *sp = “ola”;char *sp = “ola”;char *s2 = “bom dia”;char *s2 = “bom dia”;sp=&s2;sp=&s2;printf(“%s”, sp); //bom diaprintf(“%s”, sp); //bom dia

Ponteiro especial para funções: Ponteiro especial para funções: void*void*double obj=3.14;double obj=3.14;double *pd = &obj;double *pd = &obj;Void *pv = &obj;Void *pv = &obj;pv = pd;pv = pd;void* indica que o valor associado é um ponteiro mas que o tipo void* indica que o valor associado é um ponteiro mas que o tipo desse ponteiro é desconhecido. Pode ser usado para comparar desse ponteiro é desconhecido. Pode ser usado para comparar com outro ponteiro ou passar ou retornar de uma função. Pode-se com outro ponteiro ou passar ou retornar de uma função. Pode-se também atribuir a outro ponteiro do tipo void*. também atribuir a outro ponteiro do tipo void*. Não se pode operar Não se pode operar sobre o objecto para o qual aponta!!!sobre o objecto para o qual aponta!!!

Page 9: Utilização de ficheiros externos

99

Funções (versão C/C++)Funções (versão C/C++)

Ponteiros e referências;Ponteiros e referências;Int val=1024;Int val=1024;Int *pi=&ival;Int *pi=&ival;

Int &ri = ival;Int &ri = ival;

Referências referem-se sempre a um objecto; não é Referências referem-se sempre a um objecto; não é possível definir uma referência sem a inicializar; possível definir uma referência sem a inicializar; atribuição a uma referência altera o objecto a que a atribuição a uma referência altera o objecto a que a referência se refere, não o liga a outro objecto,referência se refere, não o liga a outro objecto,Ponteiros podem-se definir per se; os ponteiros Ponteiros podem-se definir per se; os ponteiros permitem que os objectos permaneçam inalterados mas permitem que os objectos permaneçam inalterados mas a atribuição liga-o a outro objecto.a atribuição liga-o a outro objecto.

Page 10: Utilização de ficheiros externos

1010

Funções (versão C/C++)Funções (versão C/C++)

Ponteiros a gogo:Ponteiros a gogo:double dval;double dval;double *pd = &val;double *pd = &val;double *pd2=pd;double *pd2=pd;int *pe = pd; int *pe = pd; //erro! Ponteiros de tipo diferente//erro! Ponteiros de tipo diferentepi = &dval; pi = &dval; // OK!// OK!

int ival =1024, ival2 =2048;int ival =1024, ival2 =2048;int *pi = &ival, *pi2=&ival2;int *pi = &ival, *pi2=&ival2;pi=pi2; pi=pi2; // pi aponta para ival2; valor de ival2 não modificado // pi aponta para ival2; valor de ival2 não modificadoint &ri =ival, &ir2 = ival2; int &ri =ival, &ir2 = ival2; // ri e ri2 sao referencias a ival e ival2// ri e ri2 sao referencias a ival e ival2ri = ri2; ri = ri2; // atribui ival2 a ival; valor de ival modificado// atribui ival2 a ival; valor de ival modificado

No último caso a atribuição altera ival, não o valor referenciado por No último caso a atribuição altera ival, não o valor referenciado por ri, mas não a referência; as 2 referências referem-se na mesma ri, mas não a referência; as 2 referências referem-se na mesma aos objectos originais e agora o valor desses objectos é o mesmoaos objectos originais e agora o valor desses objectos é o mesmo