c語言中流
A. c語言文本流和二進制流
一、文本流和二進制流
在C中引入了流(stream)的概念。它將數據的輸入輸出看作是數據的流入和流出,這樣不管是磁碟文件或者是物理設備(列印機、顯示器、鍵盤等),都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的物理結構,即對他們的操作,就是數據的流入和流出。這種把數據的輸入輸出操作對象,抽象化為一種流,而不管它的具體結構的方法很有利於編程,而涉及流的輸出操作函數可用於各種對象,與其具體的實體無關,即具有通用性。
在C中流可分為兩大類,即文本流(text stream)和二進制流(binary stream)。所謂文本流是指在流中流動的數據是以字元形式出現。在文本流中,'\n'被換成回車CR和換行LF的代碼0DH和0AH。而當輸出時,則0DH和0AH本換成'\n'。
二進制流是指流動的是二進制數字序列,若流中有字元,則用一個位元組的二進制ASCII碼表示,若是數字,則用一個位元組的二進制數表示。在流入流出時,對\n符號不進行變換。例如2001這個數,在文本流中用其ASCII碼表示為:
'2' '0' '0' '1'
| | | |
50 48 48 49
共佔4位元組。而在二進制流中則表示為:00000111 11010001 用十六進制就是07D1。只佔兩位元組。
由此看出,二進制流比文本流節省空間,且不用進行對\n的轉換,這樣可以大大加快流的速度,提高效率。因而,對於含有大量數字信息的數字流,可以採用二進制流的方式;對於含有大量字元信息的流,則採用文本流的方式。
二、流和文件
在C語言中流就是一種文件形式,它實際上就表示一個文件或設備(從廣義上講,設備也是一種文件)。把流當作文件總覺得不習慣,因而有人稱這種和流等同的文件為流式文件,流的輸入輸出也稱為文件的輸入輸出操作。當流到磁碟而成為文件時,意味著要啟動磁碟寫入操作,這樣流入一個字元(文本流)或流入一個位元組(二進制流)均要啟動磁碟操作,將大大降低傳輸效率(磁碟是慢速設備),且降低磁碟的使用壽命。為此,C語言在輸入輸出的使用使用了緩沖技術,即在內存為輸入的磁碟文件開辟了一個緩沖區(預設為512位元組),當流到該緩沖區裝滿後,再啟動磁碟一次,將緩沖區內容裝到磁碟文件中去。讀取文件也是類似。
在C語言中將此種文件輸入輸出操作稱為標准輸入輸出,或稱流式輸入輸出(因這種輸入輸出操作是ANSI C推薦的標准)。還有一種是不帶緩沖文件輸入輸出,稱為非標准文件輸入輸出或低級輸入輸出,它將由DOS直接管理。關於這兩種輸入輸出文件系統下節將會介紹。
三、文件FILE的數據結構
typedef struct
{
short level;
unsigned flags;
char fd;
unsigned char hold;
short bsize;
unsigned char *buffer;
unsigned char *curp;
unsigned istemp;
short token;
}FILE;
這是Turbo C中使用的定義(在stdio.h文件中),不同的C編譯器,可能使用不同的定義,但基本含義變化不會太大。
flags: 是一個10位的標志字,其具體含義如下:
位 代表符號 含義
0 _F_READ 讀
1 _F_WRIT 寫
2 _F_BUF 由fclose釋放緩沖區
3 _F_LBUF 行緩沖
4 _F_ERR 出錯標志
5 _F_EOF EOF文件尾標志
6 _F_BIN 二進制方式
7 _F_IN 在進行輸入
8 _F_OUT 在進行輸出
9 _F_TERM 文件是一個終端
其他各欄位內容以及flags欄位內各位所的功能,請參照其他一些資料。這里不多說了,它目前並不是我們要求的內容。
應該注意,不要把文件指針和FILE結構指針混為一談,它們代表兩個不同的地址。文件指針指出了對文件當前讀寫的數據位置,而FILE結構指針是指出了打開文件所對應的FILE結構在內存中的地址,這個指針它實際本身也包含了文件指針的信息。流指針中的各欄位是供C語言內部使用的,用戶不應該存取它的任何欄位。用fwrite寫的文件為二進制流,所以當用文本打開文件時數字變成了亂碼.解決辦法是:1.改用fprintf 或者用itoa等格式化數字為字元串,然後用fwrite#include "stdio.h"
#include "iostream.h"
struct student
{
int no;
char name[10];
}a[4];
void save()
{ int i;
FILE *p;
if ((p=fopen("1.txt","w"))==NULL)
{cout<<"\n"<<"can not open file"; <br>}
for(i=1;i<4;i++)
{
fprintf(p, "%d%10s\t", a[i].no, a[i].name);
}
fclose(p);
}
void main()
{
printf("please input no name");
int i;
for (i=1;i<4;i++)
{scanf("%d%s",&a[i].no,a[i].name); <br>}
for (i=1;i<4;i++)
{cout<<a[i].no<<a[i].name; <br>}
save();
}函數說明:fprintf int fprintf(FILE *fp, char *format,…)
stdio.h
將格式化數據寫入流式文件中
fp 文件指針
format 格式化字元,同函數printf()中的格式控制字元 … 要顯示的數據項列表2.用另一種方法進行文件輸入編碼可消除這些問題。
主要是用C++,添加頭文件# include "fstream.h"。參考代碼如下:
#include "stdio.h"
#include "iostream.h"
# include "fstream.h"
struct student
{int no; <br>char name[10]; <br>}a[4];
void main()
{
ofstream ofile ( "file.txt", ios::out ) ;
printf("please input 4 students' names\n");
int i;
for (i=0;i<4;i++)
{scanf("%s",a[i].name); <br>a[i].no=i+1; <br>ofile <<a[i].no<<" "<<a[i].name<<endl; <br>}
}
B. c語言中的「流」怎麼理解
流是磁碟或其它外圍設備中存儲的數據的源點或終點。」。這是在《C程序設計語言》上的原話。
流主要是指一種邏輯上的概念,它提供或存儲數據。產生數據的叫輸入流,消耗數據的叫輸出流。至於怎麼產生,又怎麼消耗,這是一種物理上的實現,根據每種設備有所不同,但C語言中對它們一視同仁,以一個「流」字來概括它們的特徵。作為流的使用者來說,不需要關心太多的細節。流的實現保證了它具有它所聲明的特性。C語言中對流除了分為I/O流之外,還分為文本流與二進制流。文本流的特點是流由文本行組成,每一行有0個或多個字元並以』\n』字元結束,即它是有一定意義的,以某種字元集的字元組成的一個序列。一個文本流,讀入與寫出時可能會對其內容作更改,因為它是有一定意義的,系統可以識別並在適當時候解釋,比如在輸出文本流中碰到』\b』時,系統的操作是將輸入流中的前一個字元刪除,在終端上顯示就是在它前面輸出的這個字元被刪除了;二進制流則完成是由一些「生」的,未經處理的數據組成的,C語言將它們看成由0與1組成的序列來讀與寫,所以它們的特性是同一系統中把同一二進制流讀入與寫出,其內容沒有任何變化。
C. C語言中流指什麼,不要復制,用自己的理解解釋一下,感謝了
版本四
流 原從stream翻譯來。
什麼電腦外設控制,磁碟文件輸入輸出,只要是輸入或者輸出所產生的數據都是流。
從linux對於硬體設備的控制很容易看出,對於硬體和磁碟上的文件,C語言的操作方法基本上一樣。linux中C語言也是把硬體當做文件進行操作。(本質上,它把外設與txt文本文件看成一類東西。)流的概念的提出,我認為是為了程序對於文本和硬體的一系列操作而設定的統一標准。從程序員角度來看,就不需要知道各個操作的細節,編程的時候,統一把外設都當成文件進行操作就OK了。比如對於音效卡,先OPEN打開,然後write寫入,就完成喇叭發聲,然後close關閉。和對於文本操作基本一樣。
不管對設備或是文件(廣義上都是文件)的輸入輸出操作,而產生的數據,都是I/O流。而C語言中的I/O流能分為兩種:文本流,二進制流。很容易看出文本流控制很二進制流控制的區別。你用TC,fopen打開一個MP3或者別的32位文件,然後讀取,會發現用文本流打開後,文件只能讀到開頭一點點。因為32位音樂文件有很多的'00'數據,文本流會把它當做文件結束符而結束讀取。而二進制流打開方式則可以從頭讀到尾。(這時候輸出的時候可能存在點問題,實驗的時候可以用二進制 流方式再寫入到另外一個文件來觀察。)
流是由輸入輸出產生的,是用於數據交換或轉換的統一的標准(特指這一類的數據)。C++和一些編程語言中定義的流(stream)類,就是對這類數據的定義。並通過成員函數對「流」進行操作。這樣,用戶和程序,程序和外設之間都是通過「流」進行交互。而程序員不需要知道「流」的底層到底是怎麼實現的。 就好像吃飯和排泄。數據流中定義了,先牙齒咀嚼,然後胃部消化,然後小腸吸收,然後大腸發酵,然後你懂的。你只需要CIN,還有COUT,就能控制吃喝拉撒。你管它是細嚼還是狼吞?你管它便秘還是拉肚子?吞吐量是電腦性能的事。你管它是先進小腸還是先進胃?底層是內核的事。你只需要擁有了CIN和COUT,你就擁有了一切。
從廣義上來說,流也是文件,不同於txt文本類的文件(流屬於數據,數據等同於文件)。你可以對流進行各種操作。緩沖區的定義,也是為了對流的操作。
綜上,我們知道了,流是數據,流是標准,流是文件。流的作用我們知道了,那麼「流」到底是個什麼玩意呢?非常同意 448634095 所說的。用著用著自己就知道是什麼玩意了。就好像剛開始學編程 鬧不明白函數 是個啥意思,和數學上的函數一點也不一樣。你現在知道整形是什麼了吧?你能不能給我舉個簡單的列子給我解釋下整形是什麼?
注意:流和 輸入輸出的緩沖區是兩個概念。
D. C語言「流」是什麼概念
首先理解流的意思,可以想像水從水管里出來,這就是一股水流。
然後,c語言中流動的不再是水,而是有順序的,有排列結構的數據。比如100001111100001(二進制)
C里的文件流,C里標准文件方式把文件當作流來看,也就是有一個內部緩沖buffer(在C庫內部建立,一般為512B),每次以標准方式打開文件時,讀入時先將數據讀到這個緩沖區里,寫的時候也是先寫入緩沖區里。
C里標准輸入就是stdin,標准輸出就是stdout,C對鍵盤輸入(比如scanf)和屏幕輸出(比如printf)的行緩沖機制就是建立在這些文件的流機制上的。
有時候比如scanf輸入整數時,最後一個回車就會留在流的buffer里。如果下次時你讀字元的話就會把它讀入。這就是為什麼有些C實現允許你用fflush(stdin)來清除輸入緩沖,不過C標准只定義了對普通文件和stdout等輸出流的fflush行為。因為按理說fflush刷新緩沖不應該丟棄輸入的。
E. C語言中流是什麼意思
流是磁碟或其它外圍設備中存儲的數據的源點或終點。」。這是在《C程序設計語言》上的原話。
據我的理解,流主要是指一種邏輯上的概念,它提供或存儲數據。產生數據的叫輸入流,消耗數據的叫輸出流。至於怎麼產生,又怎麼消耗,這是一種物理上的實現,根據每種設備有所不同,但C語言中對它們一視同仁,以一個「流」字來概括它們的特徵。作為流的使用者來說,不需要關心太多的細節。流的實現保證了它具有它所聲明的特性。C語言中對流除了分為I/O流之外,還分為文本流與二進制流。文本流的特點是流由文本行組成,每一行有0個或多個字元並以』\n』字元結束,即它是有一定意義的,以某種字元集的字元組成的一個序列。一個文本流,讀入與寫出時可能會對其內容作更改,因為它是有一定意義的,系統可以識別並在適當時候解釋,比如在輸出文本流中碰到』\b』時,系統的操作是將輸入流中的前一個字元刪除,在終端上顯示就是在它前面輸出的這個字元被刪除了;二進制流則完成是由一些「生」的,未經處理的數據組成的,C語言將它們看成由0與1組成的序列來讀與寫,所以它們的特性是同一系統中把同一二進制流讀入與寫出,其內容沒有任何變化。
F. C語言中流是什麼意思
C語言的I/O系統為用戶提供了一個介面,該介面與實際的存取設備無關。只是設備的一個抽象表示形式。這個抽象的介面稱為流,實際的設備稱為文件。
C文件系統可以與各種設備一起使用,如列印機、硬碟、終端等,緩沖文件系統可以將每個設備轉換成邏輯設備,即所謂的流。所有的流工作方式類似,所以很容易操作不同的設備。流有2種類型:文本流和二進制流。
文本流是一系列字元,可以由多行構成,每行由一個換行符終止。
二進制流是一系列位元組,並與外部設備上的位元組一一對應。
G. c語言中流的知識點
這個一時半會不是很好解釋,可以去看看關於套接字傳輸的知識,不過看之前先把IO,進程,線程,管道,信號以及TCP ,UDP協議看看哦,別人告訴你再多,其實還不如你自己去看去學來的好,哪怕慢一點,也是沒關系的,學習在於堅持而不在於你學的多快多。