Resumen
Esta clase abre la séptima unidad del curso, dedicada al texto y a los archivos. Explica para qué sirve la unidad: enseñar a tratar el texto como dato, con su codificación real, y a hacer que un programa lea y escriba archivos sin romperse ante una entrada mal formada; presenta sus cuatro clases y el hilo que las une; recuerda lo que la unidad da por sabido, sobre todo que un carácter es, para la máquina, un número, y los vectores, los registros y las funciones de las unidades 5 y 6; formula el problema que la unidad resuelve, el de un programa de apariencia correcta que pierde datos sin avisar, se detiene en la primera línea inesperada y mide mal los nombres con tildes; anticipa que una letra no siempre ocupa un byte; y muestra adónde conduce, en la unidad 8 y en el curso Programación en C++ II.
Objetivos de aprendizaje
- Describir la secuencia de contenidos de la unidad y explicar qué aporta cada clase a la siguiente.
- Recordar la representación de los caracteres como códigos numéricos (clase 2.4) y escribir un código en binario y en hexadecimal.
- Anticipar, con un ejemplo, que una letra no siempre es un byte, y que por eso contar bytes no es contar letras.
- Reconocer qué se espera saber hacer al terminar la unidad, y distinguirlo de lo que se aprenderá en la unidad siguiente y en Programación en C++ II.
Evaluación de entrada
Antes de recorrer la unidad conviene medir el punto de partida. Esta evaluación es una autoevaluación: no se califica, y su único propósito es orientar el estudio. Las seis primeras preguntas comprueban lo que la unidad da por sabido: el código de un carácter, la escritura de un número en binario y en hexadecimal, una máscara de bits, el recorrido de un vector que filtra sus elementos, lo que ocurre cuando una lectura recibe letras en lugar de un número y la definición de un registro. Las cuatro siguientes tocan, en el orden de las clases, las ideas centrales de la unidad: lo que devuelve una búsqueda que no encuentra nada, el tamaño de una palabra con tilde, la línea vacía que aparece al mezclar dos maneras de leer y el archivo que no se pudo abrir. Nadie está obligado a acertar estas cuatro todavía, y en algunas «todavía no lo sé» es una respuesta honesta: cada respuesta, acertada o no, explica el punto y nombra la clase que lo trata. Las mismas destrezas se vuelven a medir al final, en la clase de síntesis.
Antes de comenzar la unidad, mide tu punto de partida. Es una autoevaluación breve: no se califica y su resultado se guarda solo en tu navegador.
Pregunta 1De unidades anteriores¿Qué escribe
std::println("{:d} {:d}", 'A', 'a');?Cree que las minúsculas siguen inmediatamente a las mayúsculas; entre ambas hay 32 códigos, con algunos signos en medio.Ignora que{:d}pide el código; sin él,std::printlnescribiría la letra.Invierte el orden: en ASCII las mayúsculas tienen códigos menores que las minúsculas.Uncharguarda un número, el código del carácter, y{:d}pide escribir ese número y no la letra. En ASCII, las mayúsculas empiezan en 65 y las minúsculas en 97: la distancia es 32, un solo bit. La clase El texto no es ASCII parte de aquí para explicar qué ocurre con las letras que no están en ASCII.Pregunta 2De unidades anteriores¿Cómo se escribe 233 en binario y en hexadecimal?
Agrupa mal los cuatro bits bajos:1001es 9, no 1.Lee los bits al revés, del menos significativo al más significativo.Confunde la escritura hexadecimal con la decimal.. Agrupados de cuatro en cuatro desde la derecha, los bits1110y1001son 14 y 9, es decir,ey9. Es el código de la «é», y la unidad mostrará que en un archivo de texto actual ese código no se guarda como un solo bytee9, sino como dos.Repasar: Los enteros y su representación
Pregunta 3De unidades anteriores¿Cuánto vale
0xB1 & 0xC0?Confunde&con|: el o bit a bit enciende los bits altos en lugar de seleccionarlos.Cree que la máscara no cambia nada; borra los seis bits bajos.Confunde&con^, el o exclusivo.0xB1es10110001y0xC0es11000000: el y bit a bit conserva solo los dos bits altos de0xB1, que son10. Esa máscara es la que la clase El texto no es ASCII usa para reconocer los bytes que continúan una letra.Repasar: Bits y biblioteca matemática
Pregunta 4De unidades anteriores¿Qué escribe
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);?Invierte la condición:x % 2 == 0es verdadera para los pares.Cree quepush_backcopia el vector entero, o que el filtro se aplica avy se escribev.Cree quepush_backañade al comienzo; añade al final.El bucle recorrevy copia enwsolo los pares, en el orden en que aparecen;vno cambia. La unidad usa el mismo esquema con texto: recorrer los bytes de una cadena y quedarse con algunos, o recorrer las líneas de un archivo y quedarse con las válidas.Repasar: Vectores
Pregunta 5De unidades anterioresTras
int n{-1}; std::cin >> n;, el usuario escribeabc. ¿Qué valeny qué ocurre con las lecturas siguientes?Cree que la lectura fallida no deja rastro; lo deja en la variable y en el estado del flujo.Supone que C++ avisa de la entrada inválida; el programa continúa como si la lectura hubiera ido bien.Confunde la lectura de un entero con la de un carácter.La lectura salta los espacios, encuentra una letra que no puede comenzar un número y fracasa: la norma fija que la variable recibe 0, que la letra queda en el flujo y que el flujo queda en error, sin mensaje alguno. La clase Leer bien enseña a distinguir este fracaso del fin de los datos y a recuperarse de él.Repasar: Entrada, salida y errores
Pregunta 6De unidades anteriores¿Cuál de las definiciones siguientes declara correctamente un registro con un título y un año?
Olvida el punto y coma tras la llave de cierre, el primer error de quien escribe registros; el compilador lo señala con precisión.Separa los campos con comas, como los elementos de una lista; cada campo es una declaración y termina en punto y coma.Confunde un registro, con campos de tipos distintos y con nombre, con un vector, cuyos elementos son todos del mismo tipo.Cada campo se declara como una variable, con su tipo, su nombre y su valor inicial entre llaves, y la definición termina con punto y coma después de la llave de cierre. La clase Archivos de texto llena vectores de registros como este con las líneas de un archivo.Repasar: Registros
Pregunta 7Si
sesstd::string s{"casa azul"};, ¿qué devuelves.find("x")?Es la convención de otros lenguajes;std::size_tno tiene signo, y un-1convertido a él es justamentenpos, pero compararlo con unintda avisos y errores.Confunde «no encontrado» con la posición 0, que es la de una aparición al comienzo de la cadena.Es una respuesta honesta: la clase 7.1 presentafindynpos.Pregunta 8¿Qué escribe
std::println("{}", std::string{"año"}.size());en un programa guardado en UTF-8, como los de este curso?Cuenta letras;sizecuenta los bytes en que están escritas.Cree que toda letra ocupa dos bytes; las de ASCII ocupan uno.Es una respuesta honesta: la clase 7.2 lo explica byte a byte.sizecuenta bytes, no letras: la «a» y la «o» ocupan uno cada una, y la «ñ», que no está en ASCII, ocupa dos en UTF-8. La clase El texto no es ASCII explica por qué y enseña a contar las letras.Repasar: El texto no es ASCII
Pregunta 9Un programa ejecuta
int age{}; std::string name{}; std::cin >> age; std::getline(std::cin, name);y el usuario escribe36, pulsa Intro, escribeAnay pulsa Intro. ¿Qué queda enname?Supone quegetlineempieza en la línea siguiente; empieza donde>>se detuvo.Cree quegetlinevuelve a leer lo que>>ya consumió.Es una respuesta honesta: la clase 7.3 empieza por este defecto.Pregunta 10Un programa ejecuta
std::ifstream in{"data.txt"}; int x{-1}; in >> x;, perodata.txtno existe en la carpeta desde la que se ejecuta. ¿Qué ocurre?Supone que abrir un archivo inexistente es un error que C++ informa; el programa continúa sin aviso.Confunde la apertura para leer con la apertura para escribir, que sí crea el archivo.Es una respuesta honesta: la clase 7.4 empieza por esta comprobación.Abrir un archivo puede fallar, y el fallo solo se ve consultando el flujo: por eso se escribeif (!in)antes de leer. La clase Archivos de texto hace de esa comprobación una regla y explica de qué carpeta depende la búsqueda.Repasar: Archivos de texto
Cargando el contenido…