FOPEN(3) Linux Programmer's Manual FOPEN(3)

fopen, fdopen, freopen - 開啟流

#include <stdio.h>

FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fildes, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);

函式 fopen 開啟檔名為 path 指向的字串的檔案,將一個流與它關聯。

引數 mode 指向一個字串,以下列序列之一開始 (序列之後可以有附加的字元):

開啟文字檔案,用於讀。流被定位於檔案的開始。
開啟文字檔案,用於讀寫。流被定位於檔案的開始。
將檔案長度截斷為零,或者建立文字檔案,用於寫。流被定位於檔案的開始。
開啟檔案,用於讀寫。如果檔案不存在就建立它,否則將截斷它。流被定位於檔案的開始。
開啟檔案,用於追加 (在檔案尾寫)。如果檔案不存在就建立它。流被定位於檔案的末尾。
開啟檔案,用於追加 (在檔案尾寫)。如果檔案不存在就建立它。讀檔案的初始位置是檔案的開始,但是輸出總是被追加到檔案的末尾。

字串 mode 也可以包含字母 ``b'' 作為最後一個字元,或者插入到上面提到的任何雙字元的字串的兩個字元中間。這樣只是為了和 ANSI X3.159-1989 (``ANSI C'') 標準嚴格保持相容,沒有實際的效果;在所有的遵循 POSIX 的系統中,``b'' 都被忽略,包括 Linux。(其他系統可能將文字檔案和二進位制檔案區別對待,如果在進行二進位制檔案的 I/O,那麼新增 ``b'' 是個好主意,因為你的程式可能會被移植到非 Unix 環境中。)

任何新建的檔案將具有模式 S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH (0666),然後以程序的掩碼值 umask 加以修改 (參見 umask(2)) 。

在讀/寫流上進行的讀和寫操作可以以任意的順序混合使用。注意 ANSI C 要求檔案定位函式只能插入在輸出和輸入之間,除非輸入操作遇到了檔案結束符。(如果沒有遇到這種情況,那麼讀取總是能返回除了最近寫入內容之外的結果。) 因此,最好 (在 Linux 中有時是必須的) 在對這樣的流進行的寫和讀操作之間加入一個 fseek 或是 fgetpos 操作。這個操作可以是對顯式的定位的呼叫 (例如在 fseek(..., 0L, SEEK_CUR) 中那樣),利用同時發生的副作用。(?)

以追加方式開啟檔案 (以 a 作為 mode 的第一個字元) 將使得所有後續的對這個流的寫操作發生在檔案末尾,就好像在寫之前呼叫了

fseek(stream,0,SEEK_END);
一樣。

函式 fdopen 將一個流關聯到已存在的檔案描述符, fildes. 流的模式 mode (取值為 "r", "r+", "w", "w+", "a", "a+" 之一) 必須與檔案描述符的模式想匹配。新的流的定位標識被設定為 fildes 原有的值,錯誤和檔案結束標記被清除。模式 "w" 或者 "w+" 不會截斷檔案。檔案描述符不會被複制,在關閉由 fdopen 建立的流時,也不會被關閉。對共享記憶體物件實施 fdopen 的結果是未定義的。

函式 freopen 開啟名稱為 path 指向的字串的檔案,將它與 stream 指向的流關聯。初始的流 (如果存在的話) 被關閉。引數 mode 與在函式 fopen 中用法一致。函式 freopen 主要的用處是改變與標準文字流 (stderr, stdin, 或 stdout) 相關聯的檔案

如果成功執行了 fopen, fdopenfreopen 將返回一個指向檔案物件 FILE 的指標。否則,將返回 NULL 並將設定全域性變數 errno 的值來指示錯誤發生。

fopen, fdopen, 或 freopen 提供的引數 mode 非法。

函式 fopen, fdopenfreopen 也有可能失敗並置 errnomalloc(3) 指定的值。

函式 fopen 也有可能失敗並置 errnoopen(2) 指定的值。

函式 fdopen 也有可能失敗並置 errnofcntl(2) 指定的值。

函式 freopen 也有可能失敗並置 errnoopen(2), fclose(3)fflush(3) 指定的值。

函式 fopenfreopen 遵循 ANSI X3.159-1989 (``ANSI C'') 標準。函式 fdopen 遵循 IEEE Std1003.1-1988 (``POSIX.1'') 標準。

open(2), fclose(3), fileno(3)

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

2002-01-03 BSD MANPAGE