Linux環境下可以使用下列函數打開一個流,其函數原型如下:
#include <stdio.h>
FILE * fopen(const char * restrict pathname,
const char * restrict type);
FILE * fdopen(int filedes, const char *type);
fopen函數的第1個參數表示需要打開文件的路徑,第2個參數type表示打開的方式,該值以一個字符串的形式傳入,
type 字串中包含字母a的表示"追加寫",即流打開以后,文件的讀寫位置在文件的末尾,所以成為追加寫;type字串中包括字母b的表示流以二進制文件的形式打 開,其他的則表示流以文本文件的形式打開。這一點對於Linux系統來講沒有意義,因為Linux系統下的二進制文件和文本文件都是普通文件,是字節流, 內核並不區分這二者。
如果成功打開流,fopen函數返回一個FILE對象的指針,用戶可以使用該指針操作這個流;如果失敗則返回NULL,並且設置errno錯誤號。一般來講,fopen函數是很少出錯的,其原因主要有以下3種。
指定的文件路徑有問題。type參數是一個非法字符串。文件的操作權限不夠。
fdopen 函數用於在一個已經打開的文件描述符上打開一個流,其第1個參數表示一個已經打開的文件描述符,第2個參數type的意義和fopen函數的第2個參數一 樣。只有一點不同的是,由於文件已經被打開,所以fdopen函數不會創建文件,而且也不會將文件截短為0,這一點要特別注意。這兩步操作在打開該文件描 述符的時候已經完成。
Linux環境下使用fclose函數關閉一個流,其函數原型如下:
#include <stdio.h>
int fclose(FILE *fp);
fclose函數的參數是一個FILE對象的指針,它指向需要關閉的流。如果關閉成功,fclose函數返回0,失敗返回EOF。這個值是一個定義在stdio.h文件中的宏,其值是-1。
下面實例演示了打開和關閉一個流。
(1)在vi編輯器中編輯該程序如下:
程序清單21-2 stream.c 打開並關閉一個流
#include <stdio.h>
#include <fcntl.h>
int main(void)
{
FILE *fp;
int fd;
if( (fp = fopen("test.txt", "r+")) == NULL){ /* 以讀寫方式打開流 */
perror("fail to open");
exit(1);
}
fprintf(fp, "hello world/n"); /* 向該流輸出一段信息,這段信息會反饋到文件上 */
fclose(fp); /* 關閉流 */
if( (fd = open("test.txt", O_RDWR) == -1){ /* 以讀寫的方式打開文件 */
perror("fail to open");
exit(1);
}
if((fp = fdopen(fd, "r+") == NULL){ /* 在打開的文件上打開一個流 */
perror("fail to open stream");
exit(1);
}
fprintf("hello world again/n");
fclose(fp); /* 關閉流,文件也被關閉 */
return 0;
}
(2)在shell中編譯該程序如下:
$gcc stream.c -o stream
(3)在shell中運行該程序如下:
$./stream
(4)打開test.txt文件,可以見到文件內有以下信息。
$cat test.txt
hello world
hello world again