utilização de ficheiros externos
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 PresentationTRANSCRIPT
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
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
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
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
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;
}}
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.
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:
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!!!
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.
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