Prévia do material em texto
• Pergunta 1
1 em 1 pontos
Para a manipulação de um arquivo, deve-se antes, realizar a sua abertura
através do comando “ fopen()”. Tal comando permite associar o nome físico do
arquivo assim como a sua forma de abertura. Para essa questão, analise as
linhas de código a seguir:
FILE *arq;
arq = fopen(“arquivo.dat”,”wb+”);
Assinale a alternativa que você julgue ser a correta.
Resposta
Selecionada:
Será aberto um arquivo binário “ arquivo.dat” permitindo-se
operações de leitura e de escrita. Sempre será criado um
arquivo novo, destruindo o conteúdo caso já exista um arquivo
com o mesmo nome.
Resposta
Correta:
Será aberto um arquivo binário “arquivo.dat” permitindo-se
operações de leitura e de escrita. Sempre será criado um
arquivo novo, destruindo o conteúdo caso já exista um arquivo
com o mesmo nome.
Feedback
da
resposta:
Parabéns! Sua resposta foi a correta! Você observou bem que
foi incluído o símbolo ”+”, que indica que operações de escrita
poderão ser realizadas além das operações de escrita do
símbolo “w”. O “w” indica ainda, que sempre será criado um
arquivo novo, destruindo o conteúdo do arquivo caso já exista.
Além destas informações, encontramos o símbolo “b” denotando
que o arquivo a ser aberto será do tipo binário.
• Pergunta 2
1 em 1 pontos
Suponha que existe, em um arquivo textual, uma matriz 4x4 que relaciona
os custos de um certo produto A (linhas) combinado com um produto B
(colunas) como ilustra o exemplo a seguir:
00 03 06 02
03 00 04 07
06 04 00 01
02 07 01 00
O produto não poderá ser combinado com ele mesmo. Por exemplo,
combinando-se o produto dois com o produto três, teremos o valor 01. Cada
valor de custo é representado, sempre, por dois caracteres e separados por
um espaço em branco. Analise o código a seguir que imprima, na tela, o
custo da combinação solicitada pelo usuário e preencha as lacunas.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char linha[30],custoStr[3];
int prodA,prodB,i=0;
FILE *arq;
arq=fopen("matrizcustos.txt","___");
if(arq==NULL)
{
printf("Erro de abertura de arquivo origem.");
return 0;
}
printf("Produto A (de 0 a 3):");
scanf("%d",&prodA);
printf("Produto B:(de 0 a 3): ");
scanf("%d",&prodB);
for(;i<=prodA;i++)
____(linha,30,arq);
printf("linha selecionada: %s\n",linha);
strncpy(custoStr,&linha[___],2);
custoStr[3]='\x0';
fclose(arq);
printf("Custo = %d",atoi(custoStr));
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta Selecionada:
. r ; fgets ; prodB*3 .
Resposta Correta:
. r ; fgets ; prodB*3 .
Feedback
da
resposta:
Parabéns! Sua resposta foi a correta! Você associou
corretamente os trechos de código às lacunas observando de
maneira certa o modo de abertura do arquivo (“ r”), a função de
leitura de uma linha a partir de um arquivo textual (“ fgets()”) e o
deslocamento dentro da linha (“ prodB*3”).
• Pergunta 3
1 em 1 pontos
Suponha a existência de um arquivo textual onde as palavras são
separadas pelo caractere “$” e pelo caractere “%”. Suponha também, que
há a necessidade de se implementar um programa para imprimir, na tela, o
conteúdo do referido arquivo de modo que, ao encontrar o caractere “$”
imprime-se um espaço em branco e, ao encontrar o “%” pula-se para a linha
seguinte da tela.
Para essa questão, analise o código a seguir e preencha as lacunas.
#include <stdio.h>
int main()
{
FILE *arq;
char carac;
arq=fopen("texto.txt","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
while(1)
{
carac = ____(arq);
if(___)
break;
switch(carac)
{
case '$':
carac = ' ';
break;
case '%':
carac = '\n';
break;
}
printf("%c",carac);
}
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta Selecionada:
. r ; getc ; carac == EOF.
Resposta Correta:
. r ; getc ; carac == EOF.
Feedback
da
resposta:
Parabéns! Sua resposta foi a correta! Você associou
acertadamente o modo de abertura de arquivo textual para
somente leitura (parâmetro “r”), usou a função correta para ler
um caractere do arquivo textual (“ getc()”) e testou corretamente o
fim do arquivo (“ carac == EOF”).
• Pergunta 4
1 em 1 pontos
Quando se manipula um arquivo, às vezes temos a necessidade de alterar
informações ou incluir novas. Para tanto, funções “ fseek()”, “ fgets()”, “ fputs()”,
“ fgetc()” e “ fgets()” podem ser utilizadas. Dentre as alternativas a seguir,
assinale V para verdadeiro e F para falso.
( ) a função “ fseek()“ não admite valores negativos para o seu deslocamento
mesmo quando utilizada com o parâmetro “SEEK_CUR”;
( ) no caso de gravarmos uma informação no meio do arquivo, a informação
será sobrescrita;
( ) no caso de gravarmos uma informação no meio do arquivo, toda a
informação abaixo do ponto a receber a nova informação será deslocada;
( ) a função “ fseek()“ admite três pontos de referência para o seu
deslocamento: a partir do início do arquivo (SEEK_SET), a partir da posição
corrente (SEEK_CUR) e a partir do fim do arquivo (SEEK_END).
Assinale a alternativa que você julgue ter a sequência correta.
Resposta Selecionada:
F, V, F, V.
Resposta Correta:
F, V, F, V.
Feedback
da
resposta:
Parabéns! Sua resposta foi a correta! Pelo fato da função “ fseek()”
utilizar, como parâmetro de deslocamento, um tipo “ long int”,
valores negativos podem ser colocados para que seja realizado,
um deslocamento de retrocesso do ponteiro do arquivo ou a
partir do ponto referenciado. Assim como em vetores, a escrita
em posições já gravadas provoca a sobreposição de
informações.
• Pergunta 5
1 em 1 pontos
Para essa questão, suponha que um certo arquivo mantém, em sua primeira
posição, a quantidade de registros armazenados. Após o indicativo da
quantidade, são gravados os valores na forma <int,float>. Desta forma, o
arquivo consiste em:
<qtd_registros><int1><float1><int2><float2>...<intn,floatn>.
Para essa questão, analise o código a seguir e preencha as lacunas de modo a representar o
processo de criação de um arquivo novo e gravação de três registros.
#include <stdio.h>
void GravaArq(FILE *arq, int val_i,float val_f)
{
fwrite(&val_i,sizeof(____),1,arq);
fwrite(&val_f,sizeof(____),1,arq);
}
int main()
{
FILE *arq;
int qtd=3;
arq=fopen("exercicio.dat","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo (1).\n");
return 0;
}
fwrite(&qtd,sizeof(int),1,arq);
GravaArq(arq,0,2.1);
GravaArq(arq,10,45.21);
GravaArq(arq,20,345.87);
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta Selecionada:
. int ; float ; wb .
Resposta Correta:
. int ; float ; wb .
Feedback
da
resposta:
Parabéns! Sua resposta foi a correta! Realmente, para realizar
somente operações em um arquivo binário, deve-se usar o
modo “ wb”. O processo de gravação ocorre mediante a
utilização de “ fwrite()” onde o tamanho do item gravado deve
acompanhar o tipo. No caso, foi utilizada a função “ sizeof()”
vinculado ao tipo passado como parâmetro para a gravação.
• Pergunta 6
0 em 1 pontos
Suponha a existência de um arquivo onde a primeira posição indica a
quantidade de registros armazenados. Após o indicativo da quantidade, o
arquivo armazena valores na forma <int,float>. Desta forma, o arquivo
consiste em:
<qtd_registros><int1><float1><int2><float2>...<intn,floatn>.
Para essa questão, analise o código a seguir e preencha a lacuna de modo que o programa
imprima os valores relativos ao terceiro par “<int><float>”.
#include <stdio.h>
int main()
{
FILE *arq;
int valor_int;
float valor_float;
arq=fopen("exercicio.dat","rb+");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
fseek(arq,_______________,SEEK_SET);
fread(&valor_int,sizeof(int),1,arq);
fread(&valor_float,sizeof(float),1,arq);printf("Terceiro registro: int=%d float=%f\n",valor_int,valor_float);
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta Selecionada:
(sizeof(int)+sizeof(float))*3+sizeof(int).
Resposta Correta:
(sizeof(int)+sizeof(float))*2+sizeof(int).
Feedback
da
resposta:
Infelizmente a sua resposta está incorreta. Para responder essa
questão, reflita melhor sobre quantos bytes deverão ser
deslocados para se chegar ao terceiro registro sabendo-se que
o primeiro registro vem logo em seguida do campo que
corresponde à quantidade de registros no arquivo.
• Pergunta 7
1 em 1 pontos
Uma das vantagens de um arquivo binário consiste na possibilidade do uso
direto de registros (estruturas de dados). Sendo assim, pode-se gravar ou
recuperar, com apenas uma operação, todos os dados inseridos em tal
estrutura de dados. Para essa questão, analise o trecho de código a seguir
e preencha as lacunas.
TSTRUCT ts;
. . .
arq=fopen("registros.dat","rb+");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
________; //posicionar no início do arquivo
printf("Item a ser localizado: ");
scanf("%d",&item);
while(1)
{
________; //ler a estrutura
if(________) //testar se foi encontrado o final de arquivo
break;
if(ts.item==item)
{
//manipulação do registro encontrado...
Assinale a alternativa que você julgue conter a sequência correta do
preenchimento das lacunas.
Resposta Selecionada:
rewind(arq) ; fread(&ts,sizeof(TSTRUCT),1,arq) ; feof(arq) .
Resposta Correta:
rewind(arq) ; fread(&ts,sizeof(TSTRUCT),1,arq) ; feof(arq) .
Feedback
da
resposta:
Parabéns! Sua resposta foi a correta! Você associou
corretamente as lacunas com as respectivas funções. Para o
posicionamento no início do arquivo, poderia ser usada,
também, a função “ fseek(arq,0,SEEK_SET)”. Devido ao fato de ser um
arquivo binário, a leitura deve ser “ fread()” e o teste de final de
arquivo, independentemente do modo textual ou binário, é feito
pela função “ feof()”.
• Pergunta 8
0 em 1 pontos
Em arquivos textuais, quando desejamos substituir uma informação com o
mesmo tamanho da nova informação, podemos realizar sobrescrita sem a
necessidade de criação de arquivo temporário para receber a nova versão
do conteúdo. Para essa questão, analise o código a seguir, que realiza a
troca do caractere “i” pelo caractere “y” na primeira linha do arquivo. Em sua
análise preencha as lacunas.
#include <stdio.h>
#include <string.h>
int main()
{
FILE *arq;
char linha[40];
long pos;
int i;
arq=fopen("atividade.txt","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
pos=_____; //armazenar a posicao corrente do ponteiro de arquivo.
fgets(linha,40,arq);
for(i=0;i<strlen(linha);i++)
if(linha[i]=='i')
linha[i]='y';
_____; //reposicionar no ponto anterior aa leitura
_____; //gravacao da linha.
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta Selecionada:
. r+ ; ftell(arq) ; fseek(arq,pos,SEEK_SET); fputc(linha,arq) .
Resposta Correta:
. r+ ; ftell(arq) ; fseek(arq,pos,SEEK_SET); fputs(linha,arq) .
Feedback da
resposta:
Infelizmente a sua resposta está incorreta. Para responder essa
questão, reflita e tente responder à questão: como poderemos
reposicionar o ponteiro do arquivo para que possamos
sobrescrever o conteúdo do arquivo?
• Pergunta 9
1 em 1 pontos
Ao manipularmos arquivos, alguns cuidados ou estilos devem ser tomados
para garantir ao programa um maior grau de eficiência e segurança. Dentre
as afirmativas a seguir, identifique V para verdadeiro e F para falso.
( ) arquivos binários tendem a demandar menos espaço em relação aos
arquivos texto devido ao fato de que os espaços alocados fisicamente são
proporcionados pelos tamanhos dos tipos de dados utilizados;
( ) em toda operação envolvendo arquivos, é sempre conveniente testar se a
operação, por exemplo, abertura, escrita e leitura, foram bem sucedidas;
( ) é mais conveniente abrir um arquivo sempre para leitura e escrita para
evitar testes de acesso pelo sistema operacional, tornando, portanto, o
programa mais eficiente;
( ) é conveniente abrir o arquivo com o modo justo para a demanda, ou seja,
caso for realizada apenas leitura de informações, abrir o arquivo somente
para leitura. Dessa forma, o programa torna-se mais seguro em relação ao
acesso às informações.
Assinale a alternativa que tenha a sequência correta.
Resposta Selecionada:
V, V, F, V.
Resposta Correta:
V, V, F, V.
Feedback
da
resposta:
Parabéns! Sua resposta foi a correta! Realmente, uma das
vantagens dos arquivos binários sobre os arquivos de texto é em
relação ao espaço ocupado. Enquanto que, por exemplo, o valor
inteiro 345789 ocupa seis bytes nos arquivos textuais, nos
arquivos binários são utilizados apenas quatro bytes. Como um
arquivo pode apresentar problemas, por exemplo, nos próprios
dispositivos de I/O (Input/Output – Entrada/Saída), é
conveniente testar se a operação foi bem-sucedida. Por fim, é
também conveniente abrir o arquivo com o modo adequado à
operação para tornar o programa mais seguro em relação ao
acesso e manutenção das informações. Uma informação sobre
eficiência que merece destaque é que deve-se evitar o uso das
funções “ fprintf()” e “ fscanf()” devido ao fato de que elas realizam
formatações dos valores manipulados aumentando-se, portanto,
o tempo de processamento. Para maior eficiência, deve-se
utilizar as funções “ fwrite()” e “ fread()”.
• Pergunta 10
1 em 1 pontos
Em algumas situações, temos a necessidade de conhecermos a quantidade
de palavras em um arquivo textual. Para essa questão, analise o código a
seguir e preencha as lacunas.
#include <stdio.h>
int ContPalavras(char linha[])
{
int cont=0,i=0,esp=0;
for(;linha[i]!='\x0';i++)
{
if((!esp) && (linha[i]!=' '))
{
esp=1;
cont++;
}
else
if(esp && (linha[i]==' '))
esp=0;
}
return cont;
}
int main()
{
FILE *arq;
char linha[40];
int cont=0;
arq=fopen("atividade.txt","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
while(1)
{
____(linha,40,arq);
cont+=ContPalavras(linha);
if(____)
break;
}
printf("Qtd de palavras = %d\n",cont);
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta Selecionada:
. r ; fgets ; feof(arq) .
Resposta Correta:
. r ; fgets ; feof(arq) .
Feedback
da
resposta:
Parabéns! Sua resposta foi a correta! Você observou bem que o
programa manipula um arquivo textual apenas para operações
de leitura. A contagem das palavras foi feita linha a linha,
usando-se, portanto, a função “ fgets()”. O laço deve ser
interrompido ao encontrar o final de arquivo – teste feito a partir
do valor de retorno da função “ feof()”.