Entrada / Saída Entrada e Saída em C Entrada e saída pelo console Funções getchar e putchar • Retorna ou escreve na saída padrão 1 caracter Função puts • Escreve uma cadeia de caracteres na saída padrão (gets está em desuso). • Puts é a mais rápida função para escrita de cadeias de caracteres em C Entrada e Saída em C Entrada e saída formatada pelo console Funções printf e scanf • Podem realizar leitura/escrita em vários formatos • printf (const char *string_de_controle, ...) • • Onde a string de controle define a formatação dos dados a serem impressos e o número de argumentos é indefinido Entrada e Saída em C %c %d, %i %u %e %f %o %s %x, %X %% Formatação Caracter Inteiros com sinal Inteiros sem sinal Notação científica Ponto flutuante Octal String Hexa (minúsculo e maiúsculo) Símbolo % Entrada e Saída em C %6d %06d %3.2f Formatação Inteiros ocupando 6 espaços Ocupando 6 espaços, preenchidos com 0 Ponto flutuante, precisão de 2 casas Entrada e Saída em C Scanf • printf (const char *string_de_controle, ...) • • Onde a string de controle obedece as mesmas formatações de printf • Toda a lista de argumentos de scanf após da string de controle deve ser de ponteiros para as variáveis a serem lidas Entrada e Saída em C Scanf #include int } <stdio.h> main() { char str[256]; int d; scanf("%s %d", str, &d); printf("string: %s\n", str); printf("número: %d\n", d); return 0; Entrada e Saída em C Entrada e saída com arquivos Os principais elementos são a estrutura FILE (em stdio.h) e a função fopen *fopen (const char *nome, const char *modo) FILE r w a b Onde os modos podem ser combinações de Abre para leitura Abre para escrita Insere ao final Abre em formato binário Entrada e Saída em C Função feof • Determina se chegou ao final do arquivo Funções fputs, fgets • Maior desempenho em operações de E/S com texto int fputs (const char *str, FILE *stream); char *fgets (char *str, int size, FILE *stream); Entrada e Saída em C Funções fprintf, fscanf • Mesmas funções das similares para terminais, cujo primeiro parâmetro porém é um ponteiro para a estrutura FILE correspondente ao arquivo aberto int fprintf(FILE *stream, const char *format, ... ); int fscanf(FILE *stream, const char *format, ... ); Entrada e Saída em C Fseek – Posiciona o ponteiro de leitura do arquivo em um determinado local • int fseek (FILE *f, long int offset, int origin); • • Valores possíveis de origin são SEEK_SET •– Início do arquivo SEEK_CUR – Ponteiro atual SEEK_END •– Final do arquivo Rewind – Retorna ao início do arquivo void rewind ( FILE * stream ); Entrada e Saída em C fread e fwrite • Entrada e saída de baixo nível size_t fread (void *p, size_t size, size_t count, FILE * stream); size_t fwrite (const void *p, size_t size, size_t count, FILE *stream); Entrada e Saída em C sprintf e scanf Equivalentes para leitura/escrita sobre cadeias de caracteres size_t sprintf (char *str, const char format, ...); size_t sscanf (char *str, const char format, ...); Entrada e Saída em C Streams padrão São fornecidas pela biblioteca de stdio.h São abertas automaticamente no início da execução de cada programa • stdout – Saída padrão • stdin – Entrada padrão • stderr – Saída de erro padrão Percebam que printf e scanf são apenas usos de fprintf e fscanf sobre as streams de saída e entrada padrão Entrada e Saída em C #include int } <stdio.h> main(int argc, char **argv) { FILE *f = fopen([argv[1], "r"); char c[256]; if (!f) { printf("Erro ao abrir o arquivo"); return 1; } while (!feof(f)) { fgets(c, 256, f); printf("%s", c); } fclose(f); return 0; Entrada e Saída em C Importante Arquivos abertos consomem recursos do sistema operacional Cada programa possui um número máximo de recursos do SO que pode manter abertos por vez, incluindo arquivos SEMPRE abra arquivos somente quando for preciso e feche-os tão logo não sejam mais necessários Entrada e Saída em C Faça um programa em C que leia os nomes de todos os alunos a partir de um arquivo, receba as médias finais pelo teclado, gerando um arquivo de saída com os nomes, a média e a situação de cada um (aprovado, reprovado, final) Entrada e Saída em C Faça um programa em C que a partir de dois nomes de arquivo informados (origem e destino), realize a cópia de um para outro Caso a origem exista, o programa deve pedir confirmação para sobrescrever através das letras S e N I/O básica em C++ Uso de Streams (fluxos) de I/O e classes para sua manipulação istream – classe para entrada ostream – classe para saída Objetos do tipo istream e ostream cin – associado à entrada padrão cout – associado à saída padrão cerr – associado à saída padrão de erro I/O básica em C++ I/O básica em C++ Operadores associados a I/O >> • operador de extração dos dados de entrada cin >> x; << • operador de inserção de dados na saída cout << x; I/O básica em C++ >> e << permitem encadeamento Leitura de um inteiro e um float int x; float f; cin >> x >> f; Saída de um inteiro e uma String int x; cin >> x; cout << “x vale “ << x; I/O básica em C++ >> e << podem ser sobrecarregados Rotinas de impressão mais simples • Não é necessário fazer uma rotina que trate todos os tipos Novas classes definem como serão lidas (extraídas da entrada) ou como serão escritas (inseridas na saída) Simplicidade da sintaxe facilita o aprendizado das manipulações de I/O I/O básica em C++ Rotinas auxiliares de << e >> Métodos get de istream get(char *s, int tam, char delim); get(char *s, int tam); get(char &ch); Métodos de ostream put(char c); write(char *s, streamsize n); flush(); setf(fmtflags mask); unsetf(fmtflags mask); I/O básica em C++ Rotinas auxiliares de << e >> Métodos de ostream width(int largura); fill(char ch); Manipuladores Permitem a manipulação das funcionalidades do stream cout << hex << x << endl; cout << flush; cout << right << y << endl I/O básica em C++ Principais flags de formato ios::showbase: indica a base (dec, oct ou hex) ao imprimir um valor inteiro. ios::showpoint: mostra o ponto decimal e zeros de preenchimento para valores de ponto flutuante. ios::uppercase: mostra A-F maiúsculas para valores hexadecimais e E para valores em notação científica. ios::showpos: apresenta o sinal + precedendo os valores positivos. ios::unitbuf: “Buferização Unitária” O stream é descarregado (flush) após cada inserção. I/O básica em C++ Principais flags de formato ios::basefield: controla a base (dec, oct ou hex) numérica a ser utilizada • ios::dec: formata valores na base 10. • ios::hex: formata valores na base 16 • ios::oct: formata valores na base 8 ios::floatfield: controla o formato de valores de ponto flutuante • ios::scientific: notação científica • ios::fixed: notação fixa • “automatic”: precisão indica dígitos significativos I/O básica em C++ Principais flags de formato ios::adjustfield: controla o alinhamento dos campos • ios::left: alinha campos a esquerda. Caracters de preenchimento são colocados à direita • ios::right: alinha campos a direita. Caracters de preenchimento são colocados à esquerda • ios::internal: Caracters de preenchimento são colocados entre o sinal e o valor I/O básica em C++ Principais manipuladores setiosflags: ativa um conjunto de flags de I/O. cout << setiosflags( ios::unitbuf | ios::showbase | ios::uppercase | ios::showpos); resetiosflags: desativa um conjunto de flags de I/O. cout << resetiosflags(ios::floatfield); nuppercase: desativa flag de uppercase noshowpos: desativa flag de showpos dec, hex, oct: controla a base numérica utilizada I/O básica em C++ Principais manipuladores setw: define largura mínima do campo setfill: define caracter de preenchimento setprecision: define o valor da precisão scientific, fixed: controla o formato de valores de ponto flutuante left, right, internal: controla o alinhamento do campo I/O básica em C++ Entrada e saída de baixo nível read: istream& read (char* s, streamsize n); write: ostream& write (const char* s , streamsize n); I/O básica em C++ Arquivos em C++ int } Arquivos são tratados por streams específicas (ifstream e ofstream) main(int argc, char ** argv) { ifstream is(argv[1], ios::in); if (!is) { cerr << "Erro ao abrir arquivo" << endl; return 1; } char s[256]; while (is.good()) { is >> s; cout << s << endl; } is.close(); return 0; I/O básica em C++ Na construção da stream é possível utilizar os seguintes valores ios::in ios::out ios::app ios::trunc ios::binary Abre para Abre para Abre para Elimina o Abre para leitura escrita adicionar conteúdo do arquivo entrada/saída binária I/O básica em C++ Repita os dois exercícios para E/S em C, usando as funções do C++