LINGUAGEM: Linguagem C - Capítulo 3 - Parte 5


Entrada/Saída: arquivos

fopen(), fclose()

  • #include <stdio.h>
    • FILE * fopen(const char * nomearq, const char * modo);
    • int fclose(FILE * fp);

putc(), fputc(), getc(), fgetc()

  • #include <stdio.h>
    • int putc(int char, FILE * fp);
    • int fputc(int char, FILE * fp);
    • int getc(FILE * fp);
    • int fgetc(FILE * fp);

Exemplo 1

/** ktod.c */

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[]) {

    FILE * fp;
    char ch;
    
    if ( argc != 2 ) {
 printf("sintaxe:\n");
 printf("  %s  NOME_ARQ\n",argv[0]);
 exit (1);
    }
    
    fp = fopen(argv[1],"w");
    
    if ( fp == NULL ) {
 printf("O arquivo  %s  não pode ser aberto.\n",argv[1]);
 exit(1);
    }
    
    do {
 ch = getchar();
 putc(ch, fp);
    } while ( ch != '$' );
    
    fclose(fp);
} 

Exemplo 2


/** dtos.c */

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char * argv[]) {

    FILE * fp;
    char ch;
    
    if ( argc != 2 ) {
 printf("sintaxe:\n");
 printf("  %s  NOME_ARQ\n",argv[0]);
 exit (1);
    }
    
    fp = fopen(argv[1],"r");
    
    if ( fp == NULL ) {
 printf("O arquivo  %s  não pode ser aberto.\n",argv[1]);
 exit(1);
    }
    
    ch = getc(fp);
    
    while ( ch != EOF ) {
 putchar(ch);
 ch = getc(fp);
    }
    
    fclose(fp);
}

fputs() , fgets()

  • #include <stdio.h>
    • int fputs(const char * str, FILE * fp);
    • char * fgets(char *str, int length, FILE * fp);

fread() , fwrite()

  • #include <stdio.h>
    • size_t fread(void * buffer, size_t num_bytes, size_t count, FILE * fp);
    • size_t fwrite(const void * buffer, size_t num_bytes, size_t count, FILE * fp);

Leitura Recomendada


Exercícios

1. Refaça os programas dos exemplos 3 e 4 utilizando fputs() e fgets().

2. Escreva um programa que abra um arquivo texto e conte o número de caracteres presentes nele. Imprima o número de caracteres na tela.

3. Considere um arquivo de dados do tipo texto com o seguinte conteúdo:
3
ZE SA
8.5
10.0
ANTONIO SANTOS
7.5
8.5
SEBASTIAO OLIVEIRA
5.0
6.0
    • O arquivo acima é apenas um exemplo. Nestes arquivos de alunos a primeira linha contém o número de alunos no arquivo. As linhas seguintes contém os seguintes dados:
      • nome do aluno com no máximo 50 caracteres;
      • nota da primeira prova;
      • nota da segunda prova.
    • Escreva um programa que imprima os nomes de todos os alunos que têm a média das duas notas menor que 7.0

4. Escreva um programa que grave os dados lidos no exercício anterior em um arquivo do tipo binário de acesso aleatório. O número que indica quantos alunos devem ser lidos (primeira linha do arquivo) não deve ser gravado no arquivo binário. Nesta questão os dados devem estar obrigatoriamente armazenados em um vetor de estruturas do seguinte tipo:
typedef struc _aluno
{
    char nome[81];
    float n1, n2;
} ALUNO;

5. Escreva um programa que leia de um arquivo, cujo nome sera fornecido pelo usuario, um conjunto de numeros reais e armazena em um vetor. O tamanho máximo do vetor e dado pela constante TAM_MAX. A quantidade de numeros no arquivo varia entre 0 e TAM_MAX. O programa ao final calcula a media dos numeros lidos.

6. Faça um programa que leia 10 caracteres e armazene em um arquivo 10 cópias de cada um. Exiba o conteúdo do arquivo.

7. Crie uma função que receba duas strings como parâmetros, uma com um endereço de arquivo e outra com um texto qualquer, e adicione o texto no fim do arquivo.

8. Utilizando a função do exercício anterior faça um programa que gere 10 arquivos com o nome "Teste" e extensões "01", ..., "10". Cada um contendo o texto "Texto do arquivo [NÚMERO DO ARQUIVO]".

9. Escreva um programa para armazenar o telefone de 5 amigos atravez da estrutura
struct pessoa{
     char nome[50];
     int idade;
     float altura;
     char telefone[10];
 } amigos[5];
a ser preenchida pelo usuário antes do armazenamento de cada registro.

10. Faça um programa que leia os dados do arquivo gerado no exercício anterior e salve-os num novo arquivo utilizando uma saída formatada.
FORMATO:
--------
[nome] tem [idade] anos e [altura] de altura.
Tel.: [telefone].
--------

11. Escreva um programa que leia um arquivo texto contendo linhas de dados. Em cada linha do arquivo há o nome de um aluno e duas notas. Estes dados estão separados por ponto e vírgula. Existe um ponto e vírgula ao final de cada linha. O formato dos dados e o seguinte:
ze sa; 10.0; 9.0;
antonio silva: 9.0; 7.0;
O programa deve ler estes dados e imprimir os valores lidos, a média das duas notas e se o aluno foi aprovado ou não (media >= 5). O formato de saida e:
ze sa 10.0 8.0 9.0 aprovado
antonio silva 9.0 7.0 8.0 aprovado

12. Faça um programa que ao receber o nome de um arquivo, gere uma cópia deste.

13. Escreva um programa que compare dois arquivos especificados pelo usuário e imprima sempre que os caracteres dos dois arquivos coincidirem. Por exemplo:
arquivo1.c
Olá, pessoal!
arquivo2.c
Oi, como vai?
Neste caso, os caracteres na primeira e décima primeira posição são iguais nos dois arquivos. A saída do seu programa deve ser algo como:
1 - O (79)
11 - a (97)
Os valores entre parenteses são os respectivos códigos ASCII dos caracteres.

Bibliografia e fonte:

  • [CCT] Schildt, H. (1996) C, completo e total: 3a Ed.. São Paulo, Makron.
  • LP, UFMA; Coutinho, Lucian. Linguagem de programação para ciencia da computação da ufma.http://www.deinf.ufma.br/~lrc/2009.1/LP/
  • [K&R] KERNIGHAN, B. e RITCHIE, D. (1990) C, a linguagem de programação: padrão ANSI. Rio de Janeiro: Campus.
  • DEITEL, H. M. (1999) Como programar em C. Rio de Janeiro: LTC.
  • Módulo Consultoria e Informática (1989) Linguagem C: programação e aplicações. Rio de Janeiro: LTC.