100 likes | 174 Views
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
E N D
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 Mas esta versão é muito limitada. Para aceder a um ficheiro externo num programa em C/C++ temos de definir um stream
Utilização de ficheiros externos Streams por defeito no C++: • cout : ecrã • cin : teclado • cerr : ecrã, mesmo se a saída tiver sido redireccionada Tipos: • ifstream : leitura • ofstream : escrita • fstream : escrita ou leitura Abertura para leitura e escrita: • Em C++: fstream InOut(“RW.dat”, fstream::in | fstream::out ); • Em C:InOut=fopen(“RW.dat”, “r+”);
Utilização de ficheiros externos Versão C: FILE *stream; stream = fopen(“ficheiro.dat”, “wt”); (“r” para leitura) fprintf(stream, “%d %f\n”, i, x); (ou fscanf....) fclose(stream); Para I/O binário usa-se fread e fwrite. Streams standard: • stdin (teclado), • stdout (ecrã), • stderr (ecrã se a saída tiver sido redireccionada para ficheiro) printf fprintf(stdout, …); scanf fscanf(stdin, …);
Utilização de ficheiros externos Versão C++: #include <fstream> ifstream stream; ifstream para leitura stream.open(“dados.dat”); stream >> x >> y ; dados.close(stream); Pode simplificar-se: ifstream stream(“dados.dat”)
Utilização de ficheiros externos Comparação C++/C:
Funções (versão C/C++) Passagem de variáveis entre funções: Valor Referência Nos dois casos o que é passado para o interior da função é uma cópia do valor da variável apresentada no argumento. Na passagem por valor é passado o valor contido na variável Na passagem por referência é passada a localização em memória da variável A passagem por referência é a mais utilizada quando pretendemos passar objectos complexos para dentro das funções.
Funções (versão C/C++) Exemplo de passagem por valor: Passagem por referência:
Funções (versão C/C++) Ponteiros a gogo: char *sp = “ola”; char *s2 = “bom dia”; sp=&s2; printf(“%s”, sp); //bom dia Ponteiro especial para funções: void* double obj=3.14; double *pd = &obj; Void *pv = &obj; pv = pd; void* indica que o valor associado é um ponteiro mas que o tipo desse ponteiro é desconhecido. Pode ser usado para comparar com outro ponteiro ou passar ou retornar de uma função. Pode-se também atribuir a outro ponteiro do tipo void*. Não se pode operar sobre o objecto para o qual aponta!!!
Funções (versão C/C++) Ponteiros e referências; Int val=1024; Int *pi=&ival; Int &ri = ival; Referências referem-se sempre a um objecto; não é possível definir uma referência sem a inicializar; atribuição a uma referência altera o objecto a que a referência se refere, não o liga a outro objecto, Ponteiros podem-se definir per se; os ponteiros permitem que os objectos permaneçam inalterados mas a atribuição liga-o a outro objecto.
Funções (versão C/C++) Ponteiros a gogo: double dval; double *pd = &val; double *pd2=pd; int *pe = pd; //erro! Ponteiros de tipo diferente pi = &dval; // OK! int ival =1024, ival2 =2048; int *pi = &ival, *pi2=&ival2; pi=pi2; // pi aponta para ival2; valor de ival2 não modificado int &ri =ival, &ir2 = ival2; // ri e ri2 sao referencias a ival e ival2 ri = ri2; // atribui ival2 a ival; valor de ival modificado 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 aos objectos originais e agora o valor desses objectos é o mesmo