Jin
Estoy leyendo una sección en ‘C Primer Plus’ que trata sobre archivos, secuencias y entrada de teclado. El autor conecta el concepto de flujo con archivos y define flujo de la siguiente manera:
Conceptualmente, el programa C trata con un flujo en lugar de directamente con un archivo. Una secuencia es un flujo de datos idealizado al que se asigna la entrada o salida real.. Eso significa que varios tipos de entrada con diferentes propiedades están representados por flujos con propiedades más uniformes. El proceso de abrir un archivo se convierte entonces en uno de asociar una secuencia con el archivo, y la lectura y la escritura se realizan a través de la secuencia.
¿Qué quiere decir el autor con la oración en negrita? ¿Y cuál es la conexión entre los archivos y la transmisión?
M.J.
Tenga en cuenta que los archivos y las secuencias son cosas bastante diferentes. Los archivos son solo secuencias de bytes, mientras que los Streams son solo facilitadores (ayudantes).
Los flujos entran en escena, ya que todos los programas necesitan interactuar con el entorno que los rodea de muchas formas diferentes (pueden ser archivos, pueden ser dispositivos de E/S como un monitor y un teclado, pueden ser tomas de red, etc.).
Asi que un flujo es una interfaz(una “cara” fácil de trabajar con algo que tiene muchas sutilezas irrelevantes para nosotros, ¡al igual que no necesitamos saber cómo funciona un control remoto de TV!) para activar el flujo de datos de entrada/salida, desde/hacia cualquier cosa que pueda ser una fuente/destino para esos datos de entrada/salida, ocultando los detalles de implementación de bajo nivel de las numerosas metodologías que los sistemas operativos diseñan para interactuar con el hardware de diversos diseños, en nombre de los programadores (es decir, nosotros, como programadores, no estamos realmente interesados en reprogramar la forma en que un sistema operativo interactúa con varios hardware cada vez que crear nuevo software).
Entonces, por ejemplo, pensando en la forma en que nuestro programa puede obtener información del teclado…, ¿cómo sucede eso? Eso sucede a través de un flujo oculto (oculto para el programador) que el sistema operativo proporciona para cada “proceso” (tan pronto como se ejecuta un programa, será lo que se llama un proceso), y el sistema operativo le da la dirección a la secuencia estándar creada para un proceso. automáticamente(es decir, no necesitaremos escribir código para localizar su dirección). Este flujo se denomina comúnmente “stdin” (basado en la terminología de C y Unix), o más formalmente llamado “El flujo de entrada estándar”. Nuestros programas, sin importar en qué idioma estén escritos, deben ser capaces de usar dichos flujos estándar creados por el sistema operativo a través de las bibliotecas de E/S estándar de ese idioma. Como un ejemplo, en el lenguaje de programación Cpodemos escanear el flujo de entrada estándar llamando a la función “escanear“(scanf sabrá dónde está el stdin de nuestro programa automáticamente).
Pero como otro ejemplo importante, de nuevo en Cdigamos que esta vez nuestro programa quiere escribir la entrada del usuario en un “archivo”… ¿Solo la existencia de la corriente stdin es suficiente en esta situación? ¡Por supuesto que no! Esta vez, tendremos que usar un par de arroyos, uno ya proporcionado por el sistema operativo, el stdin, para obtener la entrada del usuario, y un segundo, ¡para permitir la comunicación entre nuestro programa y el archivo! Así que tendremos que crear esta segunda corriente! Algo que se puede hacer llamando la fopen()
función. (Dato curioso: en el manual, si observa, verá que el tipo devuelto de esta función es un puntero a una estructura llamada ARCHIVO, pero eso es solo un tradicional “mala elección de palabra” para lo que en realidad es un puntero a un “flujo”! Sí, el tipo ARCHIVO en C es de hecho una secuencia, ¡y no un archivo! (¡Ya veo, loco!) Así que recuerda, el puntero ARCHIVO* NO apunta al archivo real, apunta a una secuencia que contiene la información sobre ese archivo. , incluida información sobre el búfer utilizado para la E/S del archivo, etc.)
Aviso: Los flujos que creamos nosotros mismos (por ejemplo, flujos de archivos) pueden ser bidireccionalmientras que los flujos estándar son unidireccional. Esto también se ilustra muy bien con flechas en la imagen a continuación:
Tambien como un ejemplo en el mundo de C++ para darle una comparaciónsabes que allí, las cosas están en clases en lugar de estructuras, por lo que encontrarás un objeto llamado “cout” (la salida objeto de flujo) si está emitiendo, que es un objeto conectado al flujo de salida (stdout en C), y es una instancia de la clase ostream (de la jerarquía de clases ios_base imprimirf() en C) debe ser utilizado. Esta vez nuevamente, cout no será suficiente para interactuar con otras cosas (como archivos) y necesitaremos crear nuestras propias transmisiones. En C++, se puede hacer instanciando las clases ifstream y ofstream (correspondientes a la estructura de ARCHIVO en C) que darán como resultado objetos que básicamente juegan el mismo papel que el puntero “ARCHIVO*” en C.
Espero que ayude.
crédito de la ilustración a linuxhint.com
-
@MS que mencionaste
input from keyboard, how does that happen?
con explícitamentestdout
. ¿por qué está fuera? tomas entrada. no debería serstdin
?–Jin Lim
1 de noviembre de 2020 a las 22:04
-
@JinLim Claro que fue un error, gracias por mencionarlo, ahora lo arreglé en una edición.
– MJ
20 de febrero de 2021 a las 0:51
Las personas que diseñaron C querían una forma uniforme de interactuar con diferentes fuentes de datos secuenciales, como archivos, enchufes, teclados, puertos USB, impresoras o lo que sea.
Entonces diseñaron una interfaz que podría aplicarse a todos ellos. Esta interfaz utiliza propiedades que son comunes a todas ellas.
Para que sea más fácil hablar sobre las cosas que podrían usarse a través de la interfaz, le dieron a las cosas un nombre genérico, arroyos.
La belleza de usar la misma interfaz es que se puede usar el mismo código para leer desde un archivo que desde el teclado o un zócalo.
-
¿Es una secuencia un archivo en sí mismo en su esencia? (solo por curiosidad)
– aderchox
21/10/2018 a las 20:00
-
¿Qué ES un archivo? Un archivo es una abstracción. Es una dirección en algún lugar de la memoria que indica el primer byte de una serie de bytes (también se puede fragmentar si se trata de un archivo grande). Una secuencia también es una ubicación de memoria donde se escriben y leen bytes. En ese sentido, es como un archivo en el que puede escribir y leer. Pero ambos son abstracciones. Son simplemente compensaciones de memoria donde uno puede leer y escribir datos.
– Daniel
17 de febrero de 2021 a las 0:48
daniel kaas
A corriente es una entidad lógica que representa un expediente o dispositivoque puede aceptar aporte o producción. Todas las funciones de entrada y salida en C estándar operan en flujos de datos. Los flujos se pueden dividir en textoarroyos y binario arroyos
Simplemente, una secuencia es un ARCHIVO * Como función C ARCHIVO * fopen (const char * nombre de archivo, const char * modo) Esta función devuelve un archivo *
EXPEDIENTE:
Objeto que contiene información para controlar un flujo Tipo de objeto que identifica un flujo y contiene la información necesaria para controlarlo, incluido un puntero a su búfer, su indicador de posición y todos sus indicadores de estado.
Una corriente es el C way
de tratar con diferentes medios/fuentes de datos. Estos pueden incluir decir
- Un archivo
- un zócalo
y así. A stream
como interfaz, lo ayuda a olvidar cómo se administran los datos bajo el capó y concentrarse en los objetivos deseados.
kai
Mi título de programación C usa esta es una explicación si ayuda: “Una secuencia es una abstracción de un archivo que proporciona una interfaz consistente para el programador, independientemente del dispositivo real”.
Busque y lea sobre secuencias de archivos en C de varias otras fuentes en Internet, a saber. tutorialspoint.com, etc. lo entenderás.
– No te preocupes niño
29 de julio de 2016 a las 7:31
Ya has marcado la respuesta en negrita. Eso es exactamente lo que es. Después de todo, no es una mala pregunta, pero dudo que pertenezca aquí.
– sjsam
29 de julio de 2016 a las 7:31
Tal vez tu puedas imaginar como una tubería (un tubo que transporta agua), una conexión a través de la cual los datos pueden entrar y salir.
– abhishek_naik
29 de julio de 2016 a las 7:32
@BatCoder ¿Qué quieres decir con tubería?
– Jin
29 de julio de 2016 a las 7:33
@Don’tYouWorryChild tutorialspoint es el último lugar donde debería leer sobre C o cualquier cosa relacionada con la programación.
– qwr
13 de septiembre a las 5:46