Baixe o app para aproveitar ainda mais
Prévia do material em texto
UNIVERSIDADE FEDERAL DE OURO PRETO INSTITUTO DE CIÊNCIAS EXATAS E BIOLÓGICAS DEPARTAMENTO DE COMPUTAÇÃO CIC107 – PROGRAMAÇÃO DE COMPUTADORES I 12ª Aula prática Arquivos de Texto C++ fornece três classes para lidar com arquivos: • ofstream: para escrever em arquivos (”o” = output) • ifstream: para ler arquivos (“i” = input) • fstream: para ler e/ou escrever em arquivos O uso destas classes é bastante semelhante ao uso de cin e cout aos quais já estamos habituados. A única diferença é que temos que associá-los a arquivos. Vejamos o próximo exemplo: // operações básicas de arquivos #include <iostream> #include <fstream> using namespace std; int main () { ofstream meuarquivo; //cria e abre um arquivo chamado exemplo.txt meuarquivo.open ("exemplo.txt"); meuarquivo << "Escrevendo neste arquivo.\n"; meuarquivo.close(); // fecha o arquivo return 0; } Este programa cria um arquivo chamado “exemplo.txt” (ou sobrescreve, caso o arquivo já exista) inserindo nele um texto da mesma forma que fazemos para cout, mas agora usando meuarquivo (que é do tipo ofstream). Note que é preciso chamar a biblioteca “fstream” para poder trabalhar com arquivos. A primeira operação necessária quando se lida com arquivos é associar nossa variável meuarquivo a um arquivo. Este procedimento é conhecido como “abrir’’ o arquivo. Assim, antes de ler ou escrever um arquivo executamos a operação open e como parâmetro o nome do arquivo a ser aberto (string). Para verificar se a operação open foi bem-sucedida pode-se utilizar o comando is_open() que retorna verdadeiro ou falso, dependendo se foi ou não possível abrir o arquivo. Quando terminamos a escrita ou leitura de um arquivo deve ser fechado de forma que seus recursos se tornem disponíveis novamente. Usamos para isso a operação close(). Vejamos outro exemplo onde criamos um arquivo de texto onde são inseridas duas informações. #include <iostream> #include <fstream> using namespace std; int main () { ofstream meuarquivo ("exemplo.txt"); if (meuarquivo.is_open()) { meuarquivo << "Informacao_1\n"; meuarquivo << "Informacao_2\n"; meuarquivo.close(); } else cout << "Nao foi possivel abrir o arquivo"; return 0; } A diferença desse exemplo com o anterior é que quando declaramos a variável associamos imediatamente ela a um arquivo, passando o nome do arquivo como um parâmetro de entrada. Depois de declarar a variável ofstream e associar ela a um arquivo verificamos se conseguiu abrir o arquivo com sucesso através do comando is_open(). Vejamos um exemplo de leitura de um arquivo #include <iostream> #include <fstream> using namespace std; int main () { char texto[64]; ifstream meuarquivo ("exemplo.txt"); if (meuarquivo.is_open()) { while (! meuarquivo.eof() ) { meuarquivo >> texto; cout << texto << endl; } meuarquivo.close(); } else cout << "Nao foi possivel abrir o arquivo"; return 0; } Este exemplo lê os dados de um arquivo-texto e os imprime na tela. Note que usamos a operação eof() (= "End-of-file" = fim-de-arquivo) que retorna verdadeiro caso o fim do arquivo tenha sido alcançado, ou falso caso contrário. Assim, criamos um laço que só termina quando a leitura chega ao final do arquivo (isto é, quando eof() == true). Além de salvar em arquivos mensagens de texto, também podemos salvar dados numéricos com ou sem formatação. A formatação da saída será feita utilizando a biblioteca <oimanip>. Esta formatação será exatamente igual a que usamos para as saídas das variáveis na tela através do comando cout. Vejamos o seguinte exemplo: Criar uma matriz de reais de dimensão 3x3, inserir valores na matriz. Depois de inserir todos os valores, escrevê-los em um arquivo. Gravar os valores com três dígitos decimais. #include <iostream> #include <iomanip> #include <fstream> using namespace std; int main () { float dados[3][3]; // inserir dados na matriz for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) cin >> dados[i][j]; ofstream meuarquivo ("dadosArquivo.txt"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) meuarquivo<<fixed<<setprecision(3)<<dados[i][j]<<" "; meuarquivo << endl; } meuarquivo.close(); return 0; } Nesse programa usamos a formatação fixed , que é utilizada para mostrar um número com decimais (por default são 6), e setprecision() que, quando utilizado junto com fixed, serve para indicar o número de decimais a ser mostrado. Agora vamos realizar a leitura do arquivo dadosArquivo.txt e salvar os valores em uma matriz. #include <iostream> #include <iomanip> #include <fstream> using namespace std; int main() { float M[3][3]; ifstream arq ("dadosArquivo.txt"); // leitura do arquivo if (arq.is_open()) { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) arq >> M[i][j]; } // mostra a matriz na tela for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) cout << M[i][j]; cout << endl; } arq.close(); return 0; } Exercícios 1. Crie um arquivo de dados através de um editor de textos (por exemplo, notepad), a continuação elabore um programa para leitura desses dados. 2. Crie um vetor de double de 10 elementos. Em seguida, insira valores no vetor, e salve os dados em um arquivo. Depois, crie um segundo vetor de tamanho 10 e preencha o vetor com os dados salvos no arquivo. 3. Escreva um programa que conte o número de caracteres de um arquivo-texto (como cada caracter ocupa 1 byte, você terá calculado o tamanho do arquivo em bytes). 4. Escreva um programa C++ que crie uma cópia de um arquivo "x.txt" dando-lhe o nome de "copia_x.txt". 5. Gere uma estrutura cadastro_aluno com os seguintes dados: nome, idade, nota1, nota2. Insira n alunos, depois calcular a média de notas para cada aluno. Finalmente, salvar em um arquivo os dados da estrutura e a média de notas. Repita o processo para cada aluno.
Compartilhar