Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Apostila de C - Arquivos, Entra e Saída Padrão (Lista 7)

Neste tutorial de nossa Apostila C Progressivo, iremos propor para os leitores de nosso curso uma série de questões que foram criadas pelo Curso de C da UFMG, e presentes em sua apostila, sobre os assuntos de Arquivos, Entrada e Saídas padronizadas em C.

Em seguida, iremos resolver, dar o gabarito e comentar todos os códigos.

Obtenha AQUI seu certificado de Programação C

Apostila de C da UFMG

As questões deste tutorial são da apostila de C da UFMG, um excelente material didático que está na circulando na internet há mais de 15 anos, e é gratuito e totalmente livre para uso e divulgação.

A Apostila C Progressivo está resolvendo todos as autoavaliações presentes na apostila da UFMG, e esta é a última lista do curso que é disponibilizado tanto online como em pdf para download.
Para saber mais, veja:
Apostila de C

Iremos mostrar os exercícios que são propostos sobre o assunto de Arquivos, Entra e Saída Padrão em C, que são assuntos já explicados na seção de Arquivos de nossa apostila C Progressivo.

É importante que tenha estudado tais assuntos antes de tentar fazer os testes de autoavaliações.
Não tente chutar ou rodar os códigos dos exercícios, pois assim não irá tirar proveito algum desse excelente material da UFMG.

Leia, raciocine, faça algum rabisco ou anotação em um papel caso ache necessário, mas tente responder todas as questões.
Somente ao final leia a solução comentada com gabarito.




Questões sobre Arquivos da Apostila de C


 
1- Alguns compiladores indicam que a função gets(string) é uma função "perigosa". Qual a razão disto?
     
     
    a.  A função não pode ler inteiros
    b.  Se string for um vetor de caracteres com poucas posições, o usuário pode digitar mais caracteres do que a string pode armazenar, causando sérios problemas
    c.  O usuário pode digitar algo que não seja caracter e o sistema não perceber 
    d.  A função não trabalha bem em conjunto com a função scanf 
    e.  Nenhuma das opções anteriores 

2- : O comando printf("%d, %u, %p", i, i, &i);  imprimirá:
     
     
    a.  O endereço de i e o valor de i;
    b.  O valor de i, de i sem sinal e um ponteiro para i;
    c. O valor de i, o valor de i e um ponteiro para i
    d. O valor de i, o valor de i sem sinal e o endereço de i
    e. Nenhuma das opções anteriores

3- Seja a variável double f; qual seria a forma de se efetuar a leitura de f
     
     
    a.  scanf("%f", &f);
    b.  scanf("%6f", &f); 
    c.  scanf("%lf", &f); 
    d.  scanf("%10.6f", &f); 
    e.  Nenhuma das opções anteriores

4- O que não se pode especificar com a função fopen?
     
     
    a.  O nome do arquivo a ser aberto; 
    b.  Que arquivo será aberto, para acrescentar dados 
    c.  Que arquivo será aberto, para trabalhar em modo texto
    d.  Qual é o ponteiro para o arquivo 
    e.  Nenhuma das opções anteriores

5- Para ler um caractere por vez de um arquivo, qual das seguintes funções você usaria?
     
     
    a.  getch();
    b.  getche();
    c. getc();
    d. fgets();
    e. fread();

6- Como todos arquivos precisam ser lidos seqüencialmente, não há como ler dados no meio do arquivo, sem ter feito a leitura desde o seu início.
     
     
    a.  Verdadeiro 
    b.  Falso
    c.  Depende do tipo de arquivo
    d.  Depende do sistema operacional 
    e.  Nenhuma das opções anteriores

7-  Seja o seguinte trecho de programa
    FILE *fp;
    fp = fopen("arquivo.txt", "r+");
O que está sendo feito?
     
    a.  O arquivo arquivo.tst está sendo aberto em modo texto e somente pode ser lido.
    b.  O arquivo arquivo.tst está sendo fechado para escrita
    c.  O arquivo arquivo.tst está sendo aberto em modo binário, e pode ser lido ou escrito
    d.  O arquivo arquivo.tst está sendo aberto em modo binário e somente pode ser lido
    e.  O arquivo arquivo.tst está sendo aberto em modo texto e pode ser lido ou escrito

8- Qual a afirmativa errada?
     
     
    a.  A função fgets() lê uma string de um arquivo, mas também pode ser utilizada para substituir gets() com segurança
    b.  fputs() escreve uma string em um arquivo 
    c.  fputs(string, stdprn) imprimirá a string na impressora padrão 
    d.  fseek() pode ser utilizada para procurar um determinado caractere em um arquivo
    e.  Nenhuma das opções anteriores 

9- Para gravar várias variáveis de tipos diferentes em um arquivo texto, a função mais apropriada é::
 
     
     
    a.  fwrite() 
    b.  fprintf()
    c.  fputs()
    d.  fscanf() 
    e.  Nenhuma das opções anteriores

10- Seja o seguinte programa:
#include <stdio.h>
int main()
{
    FILE *fp;
    fp = fopen("arquivo.txt", "r");
    fprintf(fp, "%d", 10);
    fclose(fp);
    return(0);
}
    Qual afirmativa é verdadeira?
     
    a.  Este código compila sem erros
    b.  Ao final da execução, o arquivo arquivo.txt conterá uma linha com o número 10 impresso nela.
    c.  A linha #include <stdio.h> não é necessária neste código
    d.  Não se deve usar return 0; neste código, pois a função main não e' int
    e.  Nenhuma das opções anteriores 



Sua nota é: em um máximo de 100.

Resolução das questões sobre Arquivos da Apostila de C

Questão 1:

Um grande problema da função gets() para pegar uma string do usuário, é que ela não tem nenhuma implementação de segurança, para limitar a quantidade de caracteres digitados pelo usuário.

Por exemplo, se você declarar uma string de 20 elementos, pode usar a gets() para introduzir, 30, 40 ou  1 milhão de caracteres. Ela deixa, o que a torna muito insegura, pois não sabemos que memória ela vai usar para armazenar os caracteres que extrapolaram o tamanho da string (overflow), sendo essa uma vulnerabilidade muito explorada.

Gabarito: b


Questão 2:

%d imprime um inteiro qualquer, %u imprime um número sem sinal (unsigned) e %p é para ponteiros (exibe o endereço de memória de uma variável através do &).

Gabarito: d


Questão 3:

Uma variável do tipo double é usada para armazenar números com alta precisão decimal, assim como o float, porém o double tem mais precisão, podemos chamar de um long float e usar %lf para armazenar valores neste double.

Gabarito: c


Questão 4:

Usamos a função fopen() para abrir arquivos, e para isso passamos o endereço do arquivo na memória do computador, bem como o modo de abertura (para ler, escrever ou adicionar).

Gabarito: d


Questão 5:

A função getc() serve especificamente para capturar um caractere de um arquivo.

Gabarito: c


Questão 6:

Podemos usar, por exemplo, a função fseek() para acessar um determinado ponto do arquivo.

Gabarito: b


Questão 7:

A letra "r" é de read, ou seja, leitura.
Porém, foi adicionado um +, o que permite abrir o arquivo tanto para leitura como escrita.

Gabarito: e


Questão 8:

A fseek() é usada para se posicionar no arquivo, e não para leitura ou escrita, e sim para se localizar.

Gabarito: d


Questão 9:

A função printf() é usada para imprimir na tela (saída padrão), já a fprintf() pode ser redirecionada para qualquer saída, como arquivos.

Questão 10:

Há uma controvérsia nesta questão da apostila.
O curso de C da UFMG diz que a opção correta é a a, que não dá erros ao compilar.

Porém, note que o arquivo foi aberto para leitura ("r"), e não para a escrita (o código usa a fprinf para escrever). Embora o compilar possa não acusar nada, à rigor isto não está certo.

Gabarito: a ou e

Nenhum comentário: