Introducción

Introducción

Con esta parte de nuestro desarrollo C en Linux, nos estamos preparando para salir de la zona teórica e ingresar a la vida real. Si siguió la serie hasta este punto e intentó resolver todos los ejercicios, ahora tendrá una idea de lo que se trata C, por lo que debe salir en la naturaleza y hacer algunas cosas prácticas, sin las cuales la teoría no tiene mucho valor. Algunos de los conceptos que verá a continuación ya se conocen, pero son extremadamente importantes para cualquier programa C en cualquier sistema operativo similar a unix. Sí, la información es válida independientemente del sistema operativo, siempre que sea algún tipo de unix, pero si se topa con algo específico de Linux, lo sabrá. Trataremos conceptos como entrada, salida y error estándar, printf () y acceso a archivos, entre otros.

E/S básica

Antes de ir más allá, tomemos un tiempo y veamos de qué se trata esta E/S. Como muchos de ustedes saben, el término significa entrada/salida y tiene un significado amplio, pero en nuestro caso estamos interesados ​​en cómo imprimir mensajes en la consola y cómo obtener la entrada del usuario, además de temas más avanzados en los mismos vena. La biblioteca C Standard C define una serie de funciones para esto, como verá, y después de leer un poco, notará que le resultará bastante difícil vivir sin él, a menos que desee volver a escribir funciones para divertirse. Es mejor que sea claro desde el principio que las instalaciones de las que habla el material no son parte del idioma C per se; Como dije, la biblioteca estándar C les ofrece.

E/S estándar

En resumen, el subtítulo anterior significa "obtener la entrada del usuario, imprimir caracteres en la salida estándar e imprimir errores en el error estándar". Hoy en día, la fuente de entrada principal, al menos en este nivel, es el teclado, y el dispositivo en el que imprime el sistema es la pantalla, pero las cosas no siempre fueron así. La entrada se realizó en los teletipos (por cierto, el nombre del dispositivo TTY proviene de eso), y el proceso fue lento y torpe. Cualquier sistema similar a Unix todavía tiene algunas sobras históricas con respecto a la E/S, pero no solo, sino para el resto de este artículo, trataremos a Stdin como el teclado y Stdout/Stderr como la pantalla. Sabe que puede redirigir a un archivo, utilizando el operador '>' ofrecido por su shell, pero no estamos interesados ​​en eso por el momento. Antes de comenzar el artículo finalmente, un pequeño recordatorio: Mac OS hasta la versión 9 tiene algunas características únicas con respecto a nuestro tema que me empujó a leer algo de documentación antes de comenzar el desarrollo en ella. Por ejemplo, en todos los sistemas UNIX (en forma), la tecla ENTER genera un LF (alimentación de línea). En Windows es CR/LF, y en Apple hasta Mac OS 9 es CR. En resumen, cada proveedor comercial de Unix intentó hacer que su oss sea "único" agregando características. Hablando de documentación, las páginas manuales de su sistema resultarán invaluables, aunque tal vez árido a veces, y también un buen libro sobre el diseño de Unix se verá bien a su lado.

Hemos visto printf () en nuestras entregas anteriores y cómo imprimir texto en la pantalla. También hemos visto scanf () como un medio para obtener texto del usuario. Para personajes individuales, puede contar con getchar () y Putchar (). Veremos ahora algunas funciones útiles de encabezados incluidas en la biblioteca estándar. El primer encabezado del que hablaremos es cype.H, y contiene funciones útiles para verificar el caso de un personaje o cambiarlo. Recuerde que cada encabezado estándar tiene una página manual, explicando qué funciones están disponibles, y dichas funciones tienen páginas de hombre, que detalla los tipos de devolución, los argumentos, etc. Aquí hay un ejemplo que convierte cada personaje en una cadena en minúsculas, usando tolower (). ¿Cómo alcanzarías lo contrario??

#include #include int main () int c; /* El personaje lee*/ mientras ((c = getchar ()) != Eof) putchar (tolower (c)); devolver 0;  

Otra pregunta para usted es: ¿de qué manera se debe modificar el código para que imprima el resultado de menor cosción solo después de una oración? Es decir, siempre que la oración siempre termine por un punto y un espacio.

printf () en detalle

Dado que es una función tan ampliamente utilizada, solo sentí que merece una subsección propia. printf () acepta argumentos prefijados con el símbolo '%' y seguido de una carta (o más), diciéndole qué tipo de entrada debe esperar. Hemos trabajado antes con '%d', que representa decimal, que es apropiado cuando trabaja con enteros. Aquí hay una lista más completa de especificadores de formato printf ():

  • D, I - Integer
  • O - Octal, sin el prefijo cero
  • x, x - hexadecimal, sin el prefijo 0x
  • u - unsigned int
  • C - char
  • S - cadena, char *
  • F, E, E, G, G, - Float - Verifique el manual de printf () de su sistema
  • P - puntero, void *, dependiente de la implementación, estándar entre Linux Distros

Te recomiendo que te tomes un tiempo para jugar con estos especificadores, y el hecho de que no tuve más detalles como precisión es porque tendrás que leer algo para ti mismo. Mientras lo hace, preste especial atención a la parte de la lista de argumentos variables, y tenga en cuenta que Linux tiene un comando llamado Printf, como parte de CoreUtils, así que asegúrese de usar la manzana de la Sección 3 (específica de Linux, como otros Unes Unices puede tener las secciones manuales establecidas de manera diferente).

scanf () es lo opuesto a printf, ya que toma la entrada del usuario en lugar de emitir al usuario. Los especificadores de formato son casi los mismos, con ciertas excepciones con respecto a las carrozas y el hecho de que no tiene un %P. Por qué crees que es? También admite listas de argumentos variables, al igual que printf ().

Acceso de archivo

Esta es otra parte esencial de E/S y, dado que C es relativamente bajo de nivel, le permite leer y escribir archivos en el disco de manera simple. El encabezado que ofrece esta funcionalidad simple es stdio.H, y la función que usará es fopen (). Toma el nombre de archivo como argumento, así como el modo que debe leerse (leer/escribir (r, w). Agregar (a) o binario (b), a diferencia del texto, pero la implementación de este último depende del sistema). fopen () Devuelve un puntero de archivo, que es un tipo. Antes de cualquier cosa, necesitará un puntero de archivo, como se ilustra:

Archivo *fp; / *Puntero de archivo */ fp = fopen ("/home/user/testfile.txt "," w "); fprintf (fp", mi archivo de prueba.")

Simple: abrí un archivo en mi disco y le escribí la cadena "mi archivo de prueba". Es posible que hayas adivinado, tengo algunos ejercicios. ¿Hará una diferencia si el archivo existe o no?? ¿Qué pasaría si existiera, pero estaba vacío?? ¿Debería haber usado append en lugar de modo de escritura?? Por qué?

Después de usar el archivo, uno debe cierralo. Esto es importante, porque al cerrar su programa le dice al sistema operativo “Hola, he terminado con este archivo. Cierre todos los búferes sucios y escriba mi archivo en el disco de manera civilizada, por lo que no se produce pérdida de datos ”.

fclose (fp);

Aquí hay un ejemplo de la vida real del uso de E/S de archivo del programa de antaño de Kimball Hawkins, que nos ayuda a recordar dos cosas: una, que debido al diseño UNIX (todo es un archivo), Stdin, Stdout y Stderr son archivos, por lo que ellos se puede usar con funciones de E/S de archivos, y dos, que la siguiente parte trata a Stderr y salga.

void store_time ()  si (Time_ok == Falso) devolver; / * No hay información de tiempo, omitirla */ /* Hora */ si (tfield [0]> 24) fprintf (stderr, "error: hora de entrada mala: '%d' \ n", tfield [0]); salida (1);  thetime-> tm_hour = tfield [0]; /* Minuto */ si (tfield [1]> 0)  si (tfield [1]> 60) fprintf (stderr, "Error: Bad Input Minum: '%d' \ n", tfield [1]); salida (1);  thetime-> tm_min = tfield [1]; 

Tratamiento de errores con stderr y salida

Su programa debe tener alguna forma de lidiar con los errores y hacer que el sistema operativo y el usuario sepan que algo salió mal. Si bien esta parte de ninguna manera es una disertación sobre cómo tratar sus posibles situaciones en C, se trata de un elemento muy útil y bien pensado de Unix: errores de salida a otro lugar, diferentes a Stdin, para que el usuario pueda separar el Dos al depurar el tema. Además, use códigos de salida para que el usuario sepa cuándo el programa terminó con éxito y cuándo no. Es por eso que Stderr existe, para la primera parte, y es por eso que Exit () también existe, para la segunda parte. El lector astuto ya obtuvo la idea de la muestra de código anterior, por lo que todo lo que se necesita es decirle al sistema que no emita texto en la salida predeterminada/estándar, sino al "canal" especial que existe especialmente para esto. Con respecto a Exit (), funciona así: cero para el éxito, cualquier otro valor entre 1 y 255 en caso de falla. Está incluido en stdlib.H y no devuelve un valor. Depende de usted, como puede ver en el código de Kimball anterior, para decirle la salida si hay un problema, por lo que puede informar a la función principal sobre el estado de salida.

Encabezados útiles

No hace falta decir que conocer la biblioteca C Standard C es obligatoria si desea tomarse en serio con el desarrollo de C en Linux. Así que aquí hay algunos otros encabezados que ofrecen instalaciones relacionadas con E/S y más:

cadena.H

Este encabezado será muy útil cuando se trabaje con conversiones de cadena (strto*()), comparando cadenas (strcmp ()) o verificando la longitud de una cadena (strlen ()).

cype.H

Además de conversión de casos, cype.H ofrece funciones que verifican varias propiedades de los personajes. Algunos de ellos son isalnum (), isUpper (), isalpha () o isspace (), y se les invita a adivinar qué hacen y cómo funcionan.

matemáticas.H

Aquí se encuentran muchas funciones necesarias para más de las cuatro operaciones aritméticas básicas, incluidos sen (), cos () o exp ().

Otras lecturas

Los lectores más experimentados me clavarán a la cruz por no tratar sujetos más avanzados como Malloc () o size_t. Como dije repetidamente, esta serie no pretendía como un libro en línea para el desarrollo de C (de todos modos no existe tal cosa), sino un buen punto de partida para principiantes. Siento que el futuro desarrollador de C debe estar relativamente bien versado en punteros y cómo funciona la asignación de memoria antes de que él/ella comience a tener pesadillas malloc (). Después del final de esta serie, se le recomienda obtener un libro en profundidad sobre C, después de pedir algunas opiniones de los viejos (no H.PAG. Los viejos de Lovecraft, espero), para evitar información falsa o engañosa. Si bien sabrá sobre Free () y Malloc () hasta que terminemos, probablemente sea mejor obtener un libro impreso y dormir con él debajo de su almohada.

Conclusión

El artículo que seguirá a este será un poco más largo, ya que profundizaremos en la forma unix de la programación C, pero se recomienda una buena comprensión de lo que se dijo aquí para que los próximos pasos sean lo más suaves posible.

  • I. C Desarrollo en Linux - Introducción
  • II. Comparación entre C y otros lenguajes de programación
  • III. Tipos, operadores, variables
  • IV. Control de flujo
  • V. Funciones
  • VI. Punteros y matrices
  • VII. Estructuras
  • VIII. E/S básica
  • Ix. Estilo de codificación y recomendaciones
  • X. Construyendo un programa
  • Xi. Embalaje para Debian y Fedora
  • Xii. Obtener un paquete en los repositorios oficiales de Debian

Tutoriales de Linux relacionados:

  • Cosas para instalar en Ubuntu 20.04
  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Cómo definir una zona de firewalld personalizada
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Mastering Bash Script Loops
  • Descarga de Linux
  • Cosas que hacer después de instalar Ubuntu 22.04 Jellyfish de Jammy ..
  • Ubuntu 20.04 Guía
  • Instale Arch Linux en VMware Workstation