DOKK / manpages / debian 11 / manpages-zh / fopen.3.zh_TW
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