Ce înseamnă ‘stream’ în C? (Programare, C, Fișier, Flux, Terminologie)

Jin a intrebat.

Citesc o secțiune din ‘C Primer Plus’ care se referă la fișiere, fluxuri și introducere de la tastatură. Autorul face legătura între conceptul de stream și fișiere și definește stream-ul după cum urmează:

Din punct de vedere conceptual, programul C tratează cu un flux în loc să trateze direct cu un fișier. Un flux este un flux idealizat de date la care se raportează intrarea sau ieșirea reală.. Aceasta înseamnă că diferite tipuri de intrări cu proprietăți diferite sunt reprezentate de fluxuri cu proprietăți mai uniforme. Procesul de deschidere a unui fișier devine astfel unul de asociere a unui flux cu fișierul, iar citirea și scrierea se realizează prin intermediul fluxului.

Ce vrea să spună autorul prin propoziția cu litere îngroșate? Și care este legătura dintre fișiere și flux?

Comentarii

  • Căutați și citiți despre fluxurile de fișiere în C din diverse alte surse de pe internet, respectiv tutorialspoint.com, etc. veți înțelege. –  > Por Don’t You Worry Child.
  • Ați marcat deja răspunsul cu litere îngroșate. Exact despre asta este vorba. Nu este o întrebare rea până la urmă, dar mă îndoiesc că locul ei este aici –  > Por sjsam.
  • Poate că puteți să vă imaginați ca pe o țeavă (un tub care transportă apă) – o conexiune prin care datele pot intra și ieși. –  > Por abhishek_naik.
  • @BatCoder Ce vrei să spui prin țeavă? –  > Por Jin.
6 răspunsuri
Klas Lindbäck

Cei care au proiectat C au dorit o modalitate uniformă de interfațare cu diferite surse de date secvențiale, cum ar fi fișiere, prize, tastaturi, porturi USB, imprimante sau orice altceva.

Așa că au proiectat o singură interfață care să poată fi aplicată la toate acestea. Această interfață utilizează proprietăți comune tuturor.

Pentru a ușura discuția despre lucrurile care pot fi utilizate prin intermediul interfeței, au dat un nume generic acestor lucruri, fluxuri.

Frumusețea folosirii aceleiași interfețe este că același cod poate fi folosit pentru a citi dintr-un fișier ca și de la tastatură sau de la un socket.

Comentarii

  • Este un stream un fișier în sine în esența sa? (doar din curiozitate) –  > Por aderchox.
  • Ce este un fișier? Un fișier este o abstracțiune. Este o adresă undeva în memorie care indică primul octet dintr-o serie de octeți (poate fi, de asemenea, fragmentat dacă este un fișier mare). Un flux este, de asemenea, o locație de memorie în care se scriu și se citesc octeți. În acest sens, este ca un fișier, în sensul că se poate scrie și citi din el. Dar ambele sunt abstracțiuni. Ele sunt pur și simplu locații de memorie unde se pot citi și scrie date –  > Por Daniel.
M-J

Observați că fișierele și fluxurile sunt lucruri foarte diferite. Fișierele sunt doar secvențe de octeți, în timp ce fluxurile sunt doar facilitatori (ajutoare).

Fluxurile intră în scenă deoarece toate programele trebuie să interacționeze cu mediul înconjurător în multe forme diferite (pot fi fișiere, dispozitive de intrare/ieșire (I/O), cum ar fi monitorul și tastatura, prize de rețea etc.).

Așadar, un flux este o interfață(o „față” ușoară pentru a lucra cu ceva care are multe subtilități irelevante pentru noi, la fel cum nu trebuie să știm cum funcționează o telecomandă de televizor). pentru declanșarea fluxului de date de intrare/ieșire, de la/către orice poate fi sursă/destinație pentru aceste date de intrare/ieșire, ascunzând detaliile de implementare de nivel scăzut a numeroaselor metodologii pe care sistemele de operare le concep pentru a interacționa cu hardware-ul proiectat în mod diferit, în numele programatorilor (adică, noi -în calitate de programatori- nu suntem cu adevărat interesați să reprogramăm modul în care un sistem de operare interacționează cu diverse hardware-uri de fiecare dată când creăm un nou software).

Deci, de exemplu, gândindu-ne la modul în care programul nostru poate primi date de la tastatură…, cum se întâmplă acest lucru? Acest lucru se întâmplă printr-un flux ascuns(ascuns programatorului) pe care sistemul de operare îl oferă pentru fiecare „proces”(De îndată ce un program este rulat, acesta va fi ceea ce se numește un proces), iar sistemul de operare îi dă adresa fluxului standard făcut pentru un proces în mod automat(adică nu va fi nevoie să scriem cod pentru a localiza adresa acestuia). Acest flux se numește în mod obișnuit „stdin”(înrădăcinat în C & terminologie Unix), sau mai formal „The Standard Input Stream”. Programele noastre, indiferent de limbajul în care sunt scrise, trebuie să fie capabile să să utilizeze astfel de fluxuri standard realizate de sistemul de operare prin intermediul bibliotecilor I/O standard ale limbajului respectiv. După cum se arată pe exemplu, în limbajul de programare C, putem scana fluxul de intrare standard prin apelarea funcției „scanf” (scanf va ști automat unde se află stdin-ul programului nostru).

Dar, deoarece un alt exemplu important, tot în C, să spunem că de data aceasta programul nostru dorește să scrie datele de intrare ale utilizatorului într-un „fișier”… Este suficientă doar existența fluxului stdin în această situație? Bineînțeles că nu! De data aceasta, va trebui să folosim o pereche de fluxuri, unul deja furnizat de sistemul de operare, stdin, pentru a obține datele de intrare ale utilizatorului, și un al doilea, pentru a permite comunicarea între programul nostru și fișier! Așadar, va trebui să să creăm acest al doilea flux! Lucru care poate fi făcut prin apelarea fopen() funcția. (Fapt amuzant: În manual, dacă observați, veți vedea că tipul returnat de această funcție este un pointer la o structură numită FILE, dar acesta este doar un tip tradițional „alegere proastă a cuvântului” pentru ceea ce este de fapt un pointer către un „stream”! Da, tipul FILE în C este într-adevăr un flux, și nu un fișier!(Înțeleg, o nebunie!) Așadar, rețineți, pointerul FILE* NU indică fișierul real, ci indică un flux care conține informații despre acel fișier, inclusiv informații despre bufferul utilizat pentru I/O-ul fișierului și etc.).

Observați: Fluxurile pe care le creăm noi înșine (de exemplu, fluxurile de fișiere) pot fi bidirecționale, în timp ce fluxurile standard sunt unidirecționale. Acest lucru este, de asemenea, ilustrat frumos cu săgeți în imaginea de mai jos:

De asemenea, ca un exemplu din lumea C++ pentru a vă oferi o comparație, știți că acolo, lucrurile sunt în clase în loc de structuri, așa că veți întâlni un obiect numit „cout”(ieșirea de ieșire) dacă faceți output, care este un obiect conectat la fluxul de ieșire(stdout în C), și este o instanță a clasei ostream(din ierarhia de clase ios_base <– ios <– ostream). Pentru a scrie pe fluxul de ieșire standard folosind cout, se folosește metoda sa „<<„(corespunzătoare lui printf() în C) trebuie utilizată. Și de această dată, cout nu va fi suficient pentru a interacționa cu alte lucruri(cum ar fi fișierele) și va trebui să ne creăm propriile fluxuri. În C++, acest lucru se poate face prin instanțierea claselor ifstream și ofstream (corespunzătoare structurii FILE din C), ceea ce va avea ca rezultat obiecte care, practic, joacă același rol ca și pointerul „FILE*” din C.

Sperăm că v-a fost de ajutor.


creditul ilustrației către linuxhint.com

Comentarii

  • @M-S ai menționat input from keyboard, how does that happen? cu explicit stdout . de ce este out? luați intrare. nu ar trebui să fie stdin ? –  > Por Jin Lim.
  • @JinLim Sigur că a fost o greșeală, mulțumesc că ați menționat-o, am corectat-o acum într-o editare. –  > Por M-J.
Daniel Kaas

A stream este o entitate logică ce reprezintă o fișier sau dispozitiv, care poate accepta intrare sau ieșire. Toate funcțiile de intrare și ieșire din C standard, operează pe fluxuri de date. Fluxurile pot fi împărțite în text, fluxuri și binare binare.

sjsam

Un flux este C way de tratare a diferitelor medii/surse de date. Acestea pot include, de exemplu

  1. un fișier
  2. un socket

și așa mai departe. A stream, ca interfață, vă ajută să uitați cum sunt gestionate datele sub capotă și să vă concentrați asupra obiectivelor dorite.

Kai

Diploma mea de programare C folosește aceasta este o explicație, dacă vă ajută: „Un Stream este o abstractizare a unui fișier care oferă o interfață coerentă programatorului, indiferent de dispozitivul real.”

Jaime Alberto Rocha

Pur și simplu, un stream este un FILE *Funcție similară funcției C FILE * fopen ( const char * filename, const char * mode )Această funcție returnează un File *

FILE:

Obiect care conține informații pentru a controla un streamTip de obiect care identifică un stream și conține informațiile necesare pentru a-l controla, inclusiv un pointer la bufferul său, indicatorul de poziție și toți indicatorii de stare.