檔案描述符與檔案指標等檔案操作的幾個問題,指標

來源:互聯網
上載者:User

檔案描述符與檔案指標等檔案操作的幾個問題,指標

1.二者對比:


檔案描述符就是open檔案時產生的一個整數,直到一個索引作用,它用於UNIX系統中,用於標識檔案。它是系統調用產生的。

檔案指標是指向一個FILE的結構體,這個結構體裡有一個元素就是檔案描述符。它用於ANSI C標準的IO庫調用中,用於標識檔案。fopen是依賴於open的;

 

既然FILE中包含檔案描述符元素,可以用fopen()直接擷取指標fp,然後使用fp獲得fp中所包含檔案描述符fd的資訊

 

檔案描述符應該是唯一的,但檔案指標(值)卻不是唯一的,但指向的對象卻應該是唯一的。

FILE *中除了包含了fd資訊,還包含了IO緩衝,所以可以理解為FILE是對fd的牆頭,是C標準形式,所以FILE *比fd更適合跨平台,應該多用fopen在,少用open。

 

C語言檔案指標與檔案描述符之間可以相互轉換:

int fileno(FILE *stream);

FILE *fdopen(int fd, const char *mode);


2.關於標準檔案

在進程建立的時候,會預設開啟三個檔案,標準輸入、標準輸出、標準出錯檔案。因為此時剛建立進程,所以開啟檔案的描述符依次是0,1,2。又因為子進程會繼承父進程的進程描述符,所以每個進程預設開啟的三個檔案都是這三個。


另外,需要注意,標準輸入、輸出都是行緩衝的;標準出錯是字元緩衝的。也就是說,一般情況下,一句printf("test");當函數執行完畢這個語句的時候,實際上是沒有輸出的;只有進程退出、緩衝區滿、緩衝區域被重新整理的時候,才會進行輸出。但是如果printf("test\n")就會重新整理標準輸出。


3.關於'\0'&&'\n'

'\0'是一個C語言約定,表示字串的結尾。\n是檔案約定,表示換行。如果一個檔案內容如下

abcd

那麼,當我們採用fgets的時候,需要的緩衝區大小是6,需要儲存以上提到的兩個字元,其中\0是fgets函數自動添加的。


標準輸入輸出裝置的檔案描述符與檔案流指標分別是什?檔案流指標與檔案描述符有什不同?

檔案描述符 0輸如 1輸出 2錯誤 之類的 自己百科一下就有了
用途可以用於重新導向啊 比如 將程式調試的錯誤資訊輸出到檔案log.txt內 可以用 &2>log.txt
檔案流是檔案內容了 用於處理檔案 和描述符是兩個概念
 
問檔案指標與檔案描述詞有什不同,為何設定兩種方式?

檔案指標FILE *fp 是個指標類型,指向FILE結構,FILE結構有很多資料,檔案描述符int fd是其中之一,也就是說fp.fd是這個檔案指標的檔案描述符。很多對fd的操作也是用的FILE結構裡面的東西,比如開啟檔案什麼的。
個人覺得,他們的關係就像是本人和學號的關係,方便管理吧。FILE就像是本人,什麼都包括學號是他的屬性之一,當然由於特殊情況兩人也可以換學號。然後某些特殊的學號也可以給專人用,比如學號是0的同學就管輸入,不管誰學號是0了都要管輸入,學號是2的比較2,就管出錯吧。至於你是誰,你這人咋樣(FILE詳細屬性)我不管。這樣簡便很多。
還有用一些東西的時候就不用fp.XXXX這麼麻煩了。除了第一段外都是個人理解。總之fd的用法是unistd.h定義的,FILE是stdio.h定義的,顯然stdio.h牛X啊,更通用,因為不只給你一家用,所以更generic吧

typedef struct {
short level; /* fill/empty level of buffer */
unsigned flags; /* File status flags */
char fd; /* File descriptor */
unsigned char hold; /* Ungetc char if no buffer */
short bsize; /* Buffer size */
unsigned char *buffer; /* Data transfer buffer */
unsigned char *curp; /* Current active pointer */
unsigned istemp; /* Temporary file indicator */
short token; /* Used for validity checking */
} FILE; /* This is the FILE object */
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.