Lista de exercícios

Aula prática 13: processamento de arquivos

11 questões conceituais sobre arquivos de texto e binários, acesso sequencial, acesso direto e tratamento de falhas, com soluções comentadas.

Responda com explicações curtas. Cada exercício contém suas próprias definições e condições, sem depender da introdução, de outros exercícios ou de materiais externos. Não é necessário compilar, programar, fazer trace manual ou simular. Use Resposta esperada como referência de autocorreção, sem entrega ou correção individual.

Objetivos de aprendizagem

  • Explicar o caminho de um dado entre programa, biblioteca C, sistema operacional e armazenamento.
  • Explicar a conversão e as verificações necessárias na escrita e na leitura textual.
  • Distinguir representação binária, tamanho de registro e transferência completa.
  • Comparar acesso sequencial e direto, identificando suas pré-condições.
  • Justificar o tratamento de falhas de abertura, leitura, escrita, posicionamento e fechamento.

Exercício 1: escrita e persistência

Considere uma escrita em C feita por um fluxo, recurso da biblioteca para acessar um arquivo aberto. Os dados passam pela biblioteca C e pelo sistema operacional antes de alcançar o armazenamento. A biblioteca pode reunir dados temporariamente em um buffer, e o sistema operacional pode manter outra cópia temporária em cache. fclose é a operação que tenta enviar a saída pendente da biblioteca e encerra o fluxo, informando se houve falha.

Corrija a afirmação: “Se a escrita informou sucesso, os dados já estão no armazenamento e o fechamento é dispensável”. Explique o caminho dos dados e o papel de fclose.

Solução

Explicação

A biblioteca C pode manter a saída no buffer do fluxo. O sistema operacional também pode manter dados em cache. O sucesso de uma escrita não demonstra que todos esses níveis já transferiram os bytes até o dispositivo.

fclose tenta enviar a saída pendente da biblioteca e encerra o fluxo. Seu retorno precisa ser conferido. Mesmo um fechamento bem-sucedido não garante resistência a uma queda de energia.

Objetivo de aprendizagem: distinguir as camadas de transferência e justificar a verificação do fechamento antes de considerar a operação concluída.

Resposta esperada

A afirmação está incorreta. O caminho é programa → biblioteca C e buffer do fluxo → sistema operacional e cache → armazenamento. fclose tenta descarregar a saída pendente e encerra o fluxo. Seu retorno deve ser verificado, sem assumir garantia contra queda de energia.

Exercício 2: representação textual e precisão

Explique por que salvar uma medida em texto com duas casas decimais pode impedir a recuperação exata do valor original. Qual é o papel dos separadores entre os campos na leitura desse texto?

Considere registros com dois campos: identificador inteiro e medida numérica. Na escrita textual, os números viram caracteres legíveis, e a medida é arredondada para duas casas decimais. A escrita separa os campos por espaço e os registros por quebra de linha. O leitor tenta converter pares de números, tratando espaços e quebras de linha como separadores equivalentes, sem conferir em qual linha cada campo aparece.

Solução

Explicação

Na escrita textual, os valores são convertidos em caracteres. Limitar uma medida a duas casas decimais pode arredondar seu valor. A leitura posterior recupera o número representado no texto, sem restaurar as casas descartadas.

Os separadores permitem distinguir os campos conforme o formato combinado entre escrita e leitura. No leitor descrito, espaços e quebras de linha separam números, mas a leitura não valida a organização de um registro por linha.

Objetivo de aprendizagem: explicar a conversão textual e reconhecer como precisão e separadores afetam a recuperação dos dados.

Resposta esperada

O arredondamento para duas casas pode descartar informação que a leitura não consegue recuperar. Os separadores distinguem os campos segundo o formato adotado. No leitor descrito, uma quebra de linha não garante, por si só, a validação de um registro completo.

Exercício 3: abertura e proteção do conteúdo

Em C, abrir um arquivo estabelece um fluxo, recurso usado nas operações de leitura ou escrita. O modo "r" abre texto existente para leitura. O modo "w" cria um arquivo para escrita ou esvazia o conteúdo de um arquivo existente. Uma abertura que falha não fornece um fluxo válido.

Justifique por que abrir um arquivo existente em modo de escrita "w" é inadequado para apenas consultar seu conteúdo. Se a abertura falhar, é válido continuar tentando ler pelo fluxo solicitado?

Solução

Explicação

O modo "w" cria ou esvazia o arquivo para escrita. O conteúdo anterior pode ser perdido já na abertura, mesmo sem uma escrita posterior. A consulta de texto existente usa "r".

Uma abertura com falha não fornece um fluxo válido. A falha precisa ser tratada antes de qualquer tentativa de leitura ou fechamento desse fluxo.

Objetivo de aprendizagem: distinguir os modos de abertura e reconhecer a abertura bem-sucedida como condição para operar sobre um fluxo.

Resposta esperada

"w" pode apagar o conteúdo que seria consultado. Para ler texto existente, deve ser usado "r". Se a abertura falhar, não é válido ler nem fechar o fluxo solicitado, pois nenhum fluxo válido foi obtido.

Exercício 4: ausência e falha na busca

Um arquivo armazena registros, cada um com um identificador que permite procurar o dado desejado. Uma busca precisa distinguir a ausência do identificador de uma falha que impede examinar todo o conteúdo necessário. Considere que não existe um índice auxiliar capaz de informar onde o registro está.

Compare duas situações: uma busca percorre corretamente um arquivo válido e termina sem encontrar o identificador procurado; outra precisa ser interrompida por erro de leitura. Por que o programa deve comunicar resultados diferentes?

Solução

Explicação

Na primeira situação, a busca reuniu informação suficiente para concluir que o identificador está ausente. Na segunda, parte do arquivo pode não ter sido examinada, portanto a ausência não foi comprovada.

Separar sucesso da operação e presença do registro evita apresentar uma falha como resposta válida à consulta.

Objetivo de aprendizagem: distinguir uma busca válida sem resultado de uma operação que não conseguiu concluir a consulta.

Resposta esperada

A primeira situação permite informar busca concluída, identificador ausente. A segunda exige informar falha na busca, pois o erro impede concluir se o identificador existe no arquivo.

Exercício 5: registro textual incompleto

Um registro textual de sensor contém dois campos obrigatórios: identificador inteiro e medida numérica. Ler esse registro exige converter os caracteres dos dois campos em números válidos. Considere que o fim normal do arquivo significa esgotar os dados disponíveis sem erro de leitura.

Avalie a afirmação: “Um registro formado por identificador e medida pode ser aceito quando o identificador foi convertido, mesmo que a medida não possa ser convertida”. Justifique e explique por que isso difere do fim normal do arquivo antes de um novo registro.

Solução

Explicação

O registro exige dois campos válidos. Converter somente o identificador não fornece a medida correspondente e não autoriza usar um valor anterior como se tivesse sido lido agora.

A falha de conversão indica que os dados não atendem ao formato esperado. O fim do arquivo antes de qualquer campo, sem erro de leitura, pode apenas indicar que não existem mais registros.

Objetivo de aprendizagem: rejeitar registros incompletos e distinguir falha de conversão de término normal da leitura.

Resposta esperada

A afirmação está incorreta: faltou uma medida válida, portanto o registro está incompleto. Isso é diferente de alcançar normalmente o fim do arquivo antes de iniciar outro registro, situação que não indica, por si só, dados inválidos.

Exercício 6: transferência binária completa

Considere um arquivo binário que armazena cópias dos bytes de registros em memória. Cada registro reúne campos relacionados, como identificador e medida. A operação recebe o tamanho de cada registro em bytes e a quantidade de registros desejada. Seu retorno informa quantos registros foram transferidos integralmente.

Explique o significado de “um item completo” quando uma operação binária solicita a transferência de um registro inteiro. Por que o tamanho do registro e a quantidade de itens transferidos são informações diferentes? Considere tanto leitura quanto escrita.

Solução

Explicação

O tamanho informa quantos bytes compõem cada item. A quantidade informa quantos desses itens foram transferidos integralmente. Um registro completo pode ocupar vários bytes, portanto um item não significa um byte.

Uma quantidade menor que a solicitada indica transferência incompleta. Na leitura, bytes parciais não devem ser aceitos como registro completo. Na escrita, não se pode afirmar que todo o conteúdo solicitado foi gravado.

Objetivo de aprendizagem: distinguir tamanho em bytes de quantidade de itens e reconhecer leituras e escritas binárias incompletas.

Resposta esperada

Um item completo é um registro com todos os bytes exigidos pelo seu tamanho. O tamanho mede bytes por registro, e a quantidade conta registros completos. Se a quantidade transferida for menor que a solicitada, a leitura ou a escrita não foi concluída integralmente.

Exercício 7: identificador, índice e deslocamento

Considere registros de sensores gravados em qualquer ordem. Cada registro tem um identificador numérico. O índice numera os registros pela ordem de gravação, começando em zero. O deslocamento mede a distância em bytes desde o início do arquivo até o início de um registro. Não existe uma regra que relacione identificador e ordem de gravação.

Diferencie identificador, índice e deslocamento em bytes. Por que conhecer apenas o identificador de um registro não permite usar esse número como posição no arquivo?

Solução

Explicação

O identificador é um dado que distingue a leitura de sensor. O índice informa a posição do registro na sequência, começando em zero. O deslocamento informa a distância, em bytes, desde uma origem até o registro.

A ordem de gravação não precisa seguir os identificadores. É necessário conhecer a correspondência entre identificador e posição, ou procurar o registro, antes de acessar sua localização diretamente.

Objetivo de aprendizagem: distinguir a identidade de um registro de sua posição lógica e de sua localização em bytes.

Resposta esperada

Identificador: dado que identifica a leitura. Índice: posição do registro na sequência. Deslocamento: distância em bytes desde uma origem. O identificador não determina a ordem de gravação, portanto não pode substituir o índice sem uma correspondência previamente conhecida.

Exercício 8: condições do acesso direto

O acesso direto tenta ler um registro a partir de uma posição determinada, sem examinar os anteriores. Considere um arquivo binário composto apenas por registros consecutivos, todos com o mesmo tamanho conhecido em bytes. O índice numera esses registros a partir de zero. Compare esse formato com um texto de linhas de tamanhos variáveis, sem uma tabela que indique onde cada linha começa.

Justifique por que registros de tamanho fixo e índice conhecido permitem localizar diretamente um registro em um arquivo binário sem cabeçalho. Por que o número de uma linha não oferece a mesma garantia em um texto cujas linhas têm tamanhos diferentes?

Solução

Explicação

Com registros de tamanho fixo, cada posição anterior ocupa a mesma quantidade de bytes. O índice informa quantos registros antecedem o alvo, permitindo determinar sua localização sem ler os anteriores.

Em linhas de tamanhos variáveis, o número da linha não informa quantos bytes a antecedem. É necessário percorrer o texto ou dispor de posições previamente registradas. O modo textual também pode realizar traduções de fim de linha.

Objetivo de aprendizagem: reconhecer as pré-condições do acesso direto por índice e explicar o limite dessa estratégia em texto de tamanho variável.

Resposta esperada

O tamanho fixo e o índice conhecido determinam quantos bytes antecedem o registro. No texto de linhas variáveis, a quantidade de linhas anteriores não determina seu tamanho total em bytes, portanto o número da linha não basta para localizar seu início diretamente.

Exercício 9: posicionamento e validade do resultado

Avalie a afirmação: “Se o posicionamento no arquivo funcionou, o registro solicitado está disponível e pode ser usado”. Explique por que o posicionamento não basta para aceitar um novo resultado.

Considere uma operação que abre o arquivo, tenta posicionar e ler um registro completo e fecha o fluxo, recurso usado para acessar o arquivo aberto. Posicionar significa estabelecer onde a próxima leitura será tentada. A posição pode estar no fim dos dados disponíveis. Por definição, essa operação só disponibiliza o novo resultado se abertura, posicionamento, leitura completa e fechamento funcionarem. Em caso de falha, a variável de saída mantém seu conteúdo anterior.

Solução

Explicação

Posicionar o fluxo apenas estabelece onde a próxima operação tentará acessar dados. Essa posição pode estar no fim do arquivo ou em um local sem um registro completo.

O contrato definido no enunciado exige leitura completa e fechamento bem-sucedido antes de disponibilizar o novo resultado. Em caso de falha, manter a variável de saída intacta não transforma seu conteúdo anterior em resultado da tentativa atual.

Objetivo de aprendizagem: distinguir posicionamento de leitura válida e justificar a aceitação do resultado somente após as verificações necessárias.

Resposta esperada

A afirmação está incorreta: posicionar não comprova a existência de um registro completo. Ainda é necessário confirmar a leitura completa e o fechamento bem-sucedido. Se a operação falhar, o conteúdo anterior da saída não pode ser apresentado como novo resultado.

Exercício 10: formato para intercâmbio

Uma struct em C agrupa campos, como identificador e medida, em um registro na memória. A exportação textual converte esses campos em caracteres legíveis. A cópia binária grava os bytes da representação em memória, que pode incluir preenchimento entre campos e variar conforme o ambiente. Considere que os programas envolvidos conseguem interpretar o mesmo formato textual de números e separadores.

Escolha entre texto com formato definido e cópia binária dos bytes de uma struct para enviar medidas a uma equipe que precisa conferir e editar os valores em um editor de texto. Justifique e explique por que os bytes da struct podem ser inadequados também entre ambientes diferentes.

Solução

Explicação

A inspeção e a edição em um editor exigem uma representação textual legível, com separadores e precisão definidos. A cópia binária dos bytes da struct preserva a representação local, sem converter os campos em caracteres numéricos.

O layout da struct pode incluir preenchimento, e os tamanhos e as representações dos campos podem variar entre ambientes. O binário local não constitui, por si só, um formato estável de intercâmbio.

Objetivo de aprendizagem: escolher a representação pelo uso pretendido e reconhecer os limites da cópia binária de registros locais.

Resposta esperada

Texto com formato definido, pois permite conferir e editar os valores em um editor. Os bytes brutos da struct dependem do layout e da representação local dos campos, que podem variar entre ambientes e impedir uma interpretação compatível.

Exercício 11: representação e forma de acesso

Um arquivo binário pode armazenar registros como sequências de bytes. No acesso sequencial, os registros são examinados em ordem. No acesso direto, uma posição conhecida ou calculável permite tentar ler um registro sem percorrer os anteriores. Considere que cada registro reúne os dados de uma medida e que seu índice indica sua posição na sequência, começando em zero.

Compare a forma de acesso adequada a duas necessidades: produzir um relatório com todos os registros de um arquivo binário e consultar um único registro de tamanho fixo cujo índice é conhecido. Justifique e avalie a afirmação: “Todo arquivo binário deve ser acessado diretamente”.

Solução

Explicação

O relatório exige examinar todos os registros, portanto o acesso sequencial atende à necessidade. A consulta isolada com tamanho fixo e índice conhecido permite acesso direto, evitando percorrer os registros anteriores.

Texto e binário descrevem a representação dos dados. Sequencial e direto descrevem a forma de acesso. A representação binária não obriga a usar acesso direto.

Objetivo de aprendizagem: relacionar a forma de acesso à necessidade de consulta e distinguir essa escolha da representação dos dados.

Resposta esperada

  • Relatório completo: acesso sequencial, pois todos os registros precisam ser examinados.
  • Consulta isolada com índice conhecido e tamanho fixo: acesso direto, pois a posição pode ser determinada sem percorrer os registros anteriores.
  • A afirmação é falsa: um arquivo binário também pode ser lido sequencialmente. Representação e forma de acesso são escolhas distintas.