Manipulação de Streams e arquivos
Transcrição
Manipulação de Streams e arquivos
Manipulação de Streams e arquivos Prof. Leandro Tonietto Estruturas de Dados em C++ - Unisinos [email protected] http://www.inf.unisinos.br/~ltonietto mar-09 Introdução Streams: Área de memória intermediária entre software e hardware. Levam os bytes de dados para dispositivos. E dos dispositivos até o programa. Exemplos: • cout é uma stream associada com o dispositivo padrão de saída (monitor), então qualquer byte enviado para cout será exibido na tela. • cin esta associada ao dispositivo de entrada padrão (teclado). Recebe bytes digitados no teclado para o programa em execução. Introdução Streams: Fluxo de bits Software cout cout << << “Teste”; “Teste”; Software cin cin >> >> dado; dado; Stream de escrita / saída Dispositivo de saída > teste 0010010110010100101111001 Stream de leitura / entrada 0010010110010100101111001 Dispositivo de entrada Introdução Existem streams associadas com qualquer dispositivo do computador. Programação com streams em C++ Streams padrão em C++. Objetos: • cin, cout, cerr e clog É necessário fazer: #include <iostream> Não esquecer: // geral using namespace std; // ou individual using std::cout; using std::cin; Programação com streams em C++ Exemplo: #include <iostream> using std::cout; int main(){ cout << “Hello world!!”; return 0; } Programação com streams em C++ Exemplo: #include <iostream> using std::cin; int main(){ int valor; cin >> valor; return 0; } Programação com streams em C++ Métodos de leitura/escrita: Alto nível: • Manipulação de dados formatados (p.e. leitura direto para uma variável int: cin >> valor) • Conversão automática de bytes para o formatação que está sendo lido; o mesmo se aplica para a escrita, conversão automática de dados de tipo qualquer para byte. • Simples de serem usados, porém com problemas de desempenho. • Não recomendado para grandes quantidades de dados. Programação com streams em C++ Métodos de leitura/escrita: Baixo nível: • Manipulação de bytes. Os bytes precisam ser tratados ou convertidos para o formato que se está utilizando. (exemplo de leitura: cin.read(buffer, 80)) • Mais complexo de se utilizar, porém muito mais rápido. • Não recomendado para pequenas quantidades de dados ou manipulação com cin / cout, que em geral implica em manipulação de poucos dados. • Deve ser utilizado para leitura/escrita de grande quantidade de dados, proveniente de dispositivos externos ou mais lentos ou para manipulação em plataformas móveis. Programação com streams em C++ Métodos de leitura/escrita: Dicas para decisão: • Volume pequeno de dados no HD? Arquivos de configuração, por exemplo. – Alto nível • São dados oriundos de uma conexão em rede? – Baixo nível • Dispositivos com recursos limitados (celulares, PDAs,...)? – Baixo nível • Ações de leitura de dados inseridos pelo teclado no prompt e exibição de dados na tela? – Alto nível Programação com streams em C++ Exemplo de leitura/escrita alto-nível: #include <iostream> using std::cin; using std::cout; int main(){ int var; cin >> var; cout << “O usuário digitou ” << var; return 0; } Programação com streams em C++ Alternativas de leitura/escrita alto-nível: #include <iostream> using std::cin; using std::cout; int main(){ char var; var = cin.get(); cout << “O usuário digitou ”; cout.put(var); cout.put(‘ ‘).put(‘.’); return 0; } Programação com streams em C++ Lendo uma linha inteira de dados: #include <iostream> using std::cin; int main(){ char buffer[80]; // lê até encontrar “\n” ou até 80 char cin.getline(buffer, 80); cout << “O usuário digitou ” << buffer; return 0; Atenção: quando ocorre a leitura de uma string } com getline() após a leitura de de dados numéricos deve-se fazer cin.get() para limpar o buffer antes de ler a string. Programação com streams em C++ Pode ser usado tanto para streams de entrada e saída Conforme ocorrem erros, alguns bits são marcados Abaixo estão listados os bits, métodos e a condição para o retorno verdadeiro eofbit – cin.eof() - Se o fim do arquivo foi encontado failbit – cin.fail() - Erro de formato sem perda de dados badbit – cin.bad() - Erro com perda de dados. Erros mais sérios goodbit – cin.good() - Se nenhum dos bits anteriores estão assinalados cin.clear() - Limpa os estados dos bits e deixa a stream como good. Programação com streams em C++ Leitura baixo-nível: Deve-se acessar a n-esima posição de memória e gravar X bytes a partir da mesma. Conceito de cabeçote de leitura: • Primeiro posicionar o cabeçote leitura (posição de memória) • Depois gravar dados em formato binário, um byte por vez. Memória: bytes da stream 0 1 2 3 4 ... Cabeçote de leitura/escrita n Programação com streams em C++ Leitura baixo-nível: Exemplo: gravar o inteiro 2361 na posição 3 memória. Conceito de cabeçote de leitura: • Converter número em bytes: (00000000 00000000 00001001 00111001) • Primeiro posicionar o cabeçote leitura na posição 3. • Depois gravar dados em formato binário, um byte por vez. Memória: bytes da stream 0 1 2 3 4 ... Cabeçote de leitura/escrita n Programação com streams em C++ Leitura baixo-nível: Exemplo: gravar o inteiro 2361 na posição 3 memória. Conceito de cabeçote de leitura: • Converter número em bytes: (00000000 00000000 00001001 00111001) • Primeiro posicionar o cabeçote leitura na posição 3. • Depois gravar dados em formato binário, um byte por vez. Memória: bytes da stream 0 1 2 3 4 ... Cabeçote de leitura/escrita n Programação com streams em C++ Leitura baixo-nível: Exemplo: gravar o inteiro 2361 na posição 3 memória. Conceito de cabeçote de leitura: • Converter número em bytes: (00000000 00000000 00001001 00111001) • Primeiro posicionar o cabeçote leitura na posição 3. • Depois gravar dados em formato binário, um byte por vez. Memória: bytes da stream 0 1 2 3 4 ... Cabeçote de leitura/escrita n Programação com streams em C++ Leitura baixo-nível: Exemplo: gravar o inteiro 3241 na posição 9 memória. Conceito de cabeçote de leitura: • Converter número em bytes: (00000000 00000000 00001100 10101001) • Primeiro posicionar o cabeçote leitura na posição 9. • Depois gravar dados em formato binário, um byte por vez. Memória: bytes da stream 0 1 2 3 4 Cabeçote de leitura/escrita 9 10 11 ... n Programação com streams em C++ Lê ou escreve um certo número de bytes Escrita char buffer[80] seekp(10); //Posiciona para escrita cout.write(buffer,20) //Escreve 20 carac. Leitura cin.seekg(10); //Posiciona para leitura cin.read(buffer,20) //lê 20 caracteres Número de caracters lidos na última operação de entrada cin.gcount() Programação com streams em C++ Para outros tipos de dados (não char[] ou char *): Deve-se fazer a conversão de para array de bytes (char []) Comando reinterpret_cast: int v = 1; cout.write(reinterpret_cast<const char*>(&v),sizeof(v)); cin.read(reinterpret_cast<char*>(&v),sizeof(v)); Pessoa p; cout.write(reinterpret_cast<const char*>(&p),sizeof(p)); cin.read(reinterpret_cast<char*>(&p),sizeof(p)); Veremos mais sobre reinterpret_cast na apresentação sobre arquivos, para utilização de cin e cout faremos leitura alto-nível
Documentos relacionados
C++ - Operações com arquivos Em C++, as classes iostream são
um lugar de recebimento ou envio de bytes. O conceito de arquivo é ampliado no sentido de considerar não somente os que existem em disco mas também o teclado, o vídeo, a impressora e as portas de c...
Leia mais