Resumo
Esta aula abre a sétima unidade do curso, dedicada ao texto e aos arquivos. Explica para que serve a unidade: ensinar a tratar o texto como dado, com sua codificação real, e a fazer com que um programa leia e escreva arquivos sem quebrar diante de uma entrada malformada; apresenta suas quatro aulas e o fio que as une; lembra o que a unidade dá por sabido, sobretudo que um caractere é, para a máquina, um número, e os vetores, os registros e as funções das unidades 5 e 6; formula o problema que a unidade resolve, o de um programa de aparência correta que perde dados sem avisar, para na primeira linha inesperada e mede mal os nomes com acentos; antecipa que uma letra nem sempre ocupa um byte; e mostra aonde conduz, na unidade 8 e no curso Programação em C++ II.
Objetivos de aprendizagem
- Descrever a sequência de conteúdos da unidade e explicar o que cada aula traz à seguinte.
- Lembrar a representação dos caracteres como códigos numéricos (aula 2.4) e escrever um código em binário e em hexadecimal.
- Antecipar, com um exemplo, que uma letra nem sempre é um byte, e que por isso contar bytes não é contar letras.
- Reconhecer o que se espera saber fazer ao terminar a unidade, e distingui-lo do que se aprenderá na unidade seguinte e em Programação em C++ II.
Avaliação de entrada
Antes de percorrer a unidade, convém medir o ponto de partida. Esta avaliação é uma autoavaliação: não se pontua, e seu único propósito é orientar o estudo. As seis primeiras perguntas verificam o que a unidade dá por sabido: o código de um caractere, a escrita de um número em binário e em hexadecimal, uma máscara de bits, o percurso de um vetor que filtra seus elementos, o que acontece quando uma leitura recebe letras em vez de um número e a definição de um registro. As quatro seguintes tocam, na ordem das aulas, as ideias centrais da unidade: o que devolve uma busca que não encontra nada, o tamanho de uma palavra com acento, a linha vazia que aparece ao misturar duas maneiras de ler e o arquivo que não pôde ser aberto. Ninguém é obrigado a acertar estas quatro ainda, e em algumas delas “ainda não sei” é uma resposta honesta: cada resposta, certa ou não, explica o ponto e nomeia a aula que o trata. As mesmas habilidades voltam a ser medidas no final, na aula de síntese.
Antes de começar a unidade, meça seu ponto de partida. É uma autoavaliação breve: não recebe nota e seu resultado fica guardado apenas no seu navegador.
Pergunta 1De unidades anterioresO que escreve
std::println("{:d} {:d}", 'A', 'a');?Acredita que as minúsculas seguem imediatamente as maiúsculas; entre ambas há 32 códigos, com alguns sinais no meio.Ignora que{:d}pede o código; sem ele,std::printlnescreveria a letra.Inverte a ordem: em ASCII, as maiúsculas têm códigos menores que as minúsculas.Umcharguarda um número, o código do caractere, e{:d}pede para escrever esse número e não a letra. Em ASCII, as maiúsculas começam em 65 e as minúsculas em 97: a distância é 32, um só bit. A aula O texto não é ASCII parte daqui para explicar o que acontece com as letras que não estão em ASCII.Pergunta 2De unidades anterioresComo se escreve 233 em binário e em hexadecimal?
Agrupa mal os quatro bits baixos:1001é 9, não 1.Lê os bits ao contrário, do menos significativo ao mais significativo.Confunde a escrita hexadecimal com a decimal.. Agrupados de quatro em quatro a partir da direita, os bits1110e1001são 14 e 9, ou seja,ee9. É o código do “é”, e a unidade mostrará que, em um arquivo de texto atual, esse código não se guarda como um só bytee9, mas como dois.Revisar: Os inteiros e sua representação
Pergunta 3De unidades anterioresQuanto vale
0xB1 & 0xC0?Confunde&com|: o OU bit a bit liga os bits altos em vez de selecioná-los.Acredita que a máscara não muda nada; ela apaga os seis bits baixos.Confunde&com^, o OU exclusivo.0xB1é10110001e0xC0é11000000: o E bit a bit conserva só os dois bits altos de0xB1, que são10. Essa máscara é a que a aula O texto não é ASCII usa para reconhecer os bytes que continuam uma letra.Revisar: Bits e biblioteca matemática
Pergunta 4De unidades anterioresO que escreve
std::vector<int> v{4, 7, 10, 3}; std::vector<int> w{}; for (const int x : v) { if (x % 2 == 0) { w.push_back(x); } } std::println("{}", w);?Inverte a condição:x % 2 == 0é verdadeira para os pares.Acredita quepush_backcopia o vetor inteiro, ou que o filtro se aplica ave se escrevev.Acredita quepush_backacrescenta no começo; acrescenta no final.O laço percorreve copia emwsó os pares, na ordem em que aparecem;vnão muda. A unidade usa o mesmo esquema com texto: percorrer os bytes de uma string e ficar com alguns, ou percorrer as linhas de um arquivo e ficar com as válidas.Revisar: Vetores
Pergunta 5De unidades anterioresDepois de
int n{-1}; std::cin >> n;, o usuário digitaabc. Quanto valene o que acontece com as leituras seguintes?Acredita que a leitura fracassada não deixa rastro; deixa-o na variável e no estado do fluxo.Supõe que o C++ avisa da entrada inválida; o programa continua como se a leitura tivesse dado certo.Confunde a leitura de um inteiro com a de um caractere.A leitura salta os espaços, encontra uma letra que não pode começar um número e fracassa: o padrão estabelece que a variável recebe 0, que a letra fica no fluxo e que o fluxo fica em erro, sem mensagem alguma. A aula Ler bem ensina a distinguir esse fracasso do fim dos dados e a recuperar-se dele.Revisar: Entrada, saída e erros
Pergunta 6De unidades anterioresQual das definições seguintes declara corretamente um registro com um título e um ano?
Esquece o ponto e vírgula depois da chave de fechamento, o primeiro erro de quem escreve registros; o compilador o aponta com precisão.Separa os campos com vírgulas, como os elementos de uma lista; cada campo é uma declaração e termina em ponto e vírgula.Confunde um registro, com campos de tipos distintos e com nome, com um vetor, cujos elementos são todos do mesmo tipo.Cada campo se declara como uma variável, com seu tipo, seu nome e seu valor inicial entre chaves, e a definição termina com ponto e vírgula depois da chave de fechamento. A aula Arquivos de texto preenche vetores de registros como este com as linhas de um arquivo.Revisar: Registros
Pergunta 7Se
séstd::string s{"casa azul"};, o que devolves.find("x")?É a convenção de outras linguagens;std::size_tnão tem sinal, e um-1convertido a ele é justamentenpos, mas comparar o resultado com-1funciona só por essa conversão e produz um aviso do compilador.Confunde “não encontrado” com a posição 0, que é a de uma ocorrência no começo da string.É uma resposta honesta: a aula 7.1 apresentafindenpos.finddevolve uma posição, de tipostd::size_t, e, quando não encontra nada, devolve um valor que nenhuma posição pode ter:npos, que com 64 bits vale . A aula Cadeias de caracteres ensina a compará-lo sempre de maneira explícita.Revisar: Cadeias de caracteres
Pergunta 8O que escreve
std::println("{}", std::string{"año"}.size());em um programa salvo em UTF-8, como os deste curso?Conta letras;sizeconta os bytes em que elas estão escritas.Acredita que toda letra ocupa dois bytes; as de ASCII ocupam um.É uma resposta honesta: a aula 7.2 o explica byte a byte.sizeconta bytes, não letras: na palavra espanhola “año” (ano), o “a” e o “o” ocupam um cada, e o “ñ”, que não está em ASCII, ocupa dois em UTF-8. A aula O texto não é ASCII explica por quê e ensina a contar as letras.Revisar: O texto não é ASCII
Pergunta 9Um programa executa
int age{}; std::string name{}; std::cin >> age; std::getline(std::cin, name);e o usuário digita36, pressiona Enter, digitaAnae pressiona Enter. O que fica emname?Supõe quegetlinecomeça na linha seguinte; começa onde>>parou.Acredita quegetlinevolta a ler o que>>já consumiu.É uma resposta honesta: a aula 7.3 começa por esse defeito.Pergunta 10Um programa executa
std::ifstream in{"data.txt"}; int x{-1}; in >> x;, masdata.txtnão existe na pasta a partir da qual é executado. O que acontece?Supõe que abrir um arquivo inexistente é um erro que o C++ informa; o programa continua sem aviso.Confunde a abertura para ler com a abertura para escrever, que sim cria o arquivo.É uma resposta honesta: a aula 7.4 começa por essa verificação.Abrir um arquivo pode falhar, e a falha só se vê consultando o fluxo: por isso se escreveif (!in)antes de ler. A aula Arquivos de texto faz dessa verificação uma regra e explica de que pasta depende a busca.Revisar: Arquivos de texto
Carregando o conteúdo…