檔案描述符與檔案指標等檔案操作的幾個問題,指標
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 */