1. 程式人生 > >Unix環境高級編程(三)標準I/O庫

Unix環境高級編程(三)標準I/O庫

buffer 文件創建 fop read 通信通道 種類 目的 lose com

  標準I/O庫是ISO C的標準,在很多操作系統上面都實現。Unix文件I/O函數都是針對文件描述符的,當打開一個文件的時候,返回該文件描述符用於後續的I/O操作。而對於標準I/O庫,操作則是圍繞流進行,當用標準I/O庫打開或者創建一個文件時,使得一個流與文件相關聯。標準I/O庫使用了緩沖技術,使用緩沖的目的是盡可能減少使用read和write調用次數,但是效率不高。每次進行讀寫時候需要復制兩次數據。第一次是在內核和標準I/O緩沖之間(調用read和write),第二次是在標準I/O緩沖區和用戶程序中的行緩沖區之間。提供了三種類型的緩沖:全緩沖、行緩沖和不帶緩沖。標準I/O預定義三個文件指針stdin、stdout和stderr。

  當一個流最初被創建的時候,沒有定向。可以用fwide函數設置流的定向,freopen函數清除一個流的定向。采用setbuf和setvbuf函數更改緩沖區類型,fflush函數沖洗一個流。

int fwide(FILE *stream, int mode); //若流是寬字符定向則返回正值,若是字節定向則返回負值,如實為定向的則返回0
void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
_IONBF  unbuffered  _IOLBF  line buffered  _IOFBF  fully buffered
int fflush(FILE *fp); I/O操作函數:
FILE *fopen(const char *path, const char *mode); //打開一個指定的文件
FILE *fdopen(int fd, const char *mode); //獲取一個現有的文件描述符,使得一個I/O流與該描述符先結合,常用於由創建管道和網絡通信通道函數返回的描述符。
FILE *freopen(const char *path, const char *mode, FILE *stream);//在一個指定的流上打開一個指定的文件
int fclose(FILE* fp); 一次讀取一個字符
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void); 一次讀取一行
char *fgets(char *s, int size, FILE *stream);
char *gets(char *s); 一次寫一個字符
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c); 一次寫入一行
int fputs(const char *s, FILE *stream);
int puts(const char *s); 針對二進制I/O,一般是結構體類型
size_t fread(void *ptr, size_t size, size_t nmembFILE *" stream );
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); 文件定位函數
int fseek(FILE *stream, long offset, int whence); //設置文件的位置
long ftell(FILE *stream); //返回當前文件的位置指示
void rewind(FILE *stream); //將一個流的位置設置到文件的開始位置
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);
fgetpos函數將文件指示器的當前值存入有pos指向的對象中,在以後調用fsetpos時,可以使用此值將流重新定位到該位置。 格式化I/O: #include <stdio.h> int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...); //寫入到文件
int sprintf(char *str, const char *format, ...); //格式化字符串,可以將其他類型轉換為字符串
int snprintf(char *str, size_t size, const char *format, ...); #include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap); #include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...); //從文件中讀取
int sscanf(const char *str, const char *format, ...); //可以提取字符串內容,遇到空格停止 #include <stdarg.h>
int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap); 在Unix系統中,標準I/O庫最終都要調用文件I/O,每個標準I/O流都有一個與其相關聯的文件描述符。一個流可以通過調用fileno函數獲取其描述符。 int fileno(FILE *fp) //在調用dup和fcntl函數的時候用到 臨時文件創建函數tmpnam和tepfile char *tmpnam(char *s
);
FILE *tmpfile(void); 針對標準I/O寫個程序進行練習,程序如下: 技術分享圖片
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <wchar.h>
 5 
 6 #define BUFSIZE 1024
 7 
 8 int main()
 9 {
10     char *filename = ".//test.log";
11     char buf[BUFSIZE];
12     char line[100];
13     FILE *fp;
14     memset(line,0,100);
15     //打開文件,不存在則創建
16     fp = fopen(filename,"w+");
17     if(fp == NULL)
18     {
19         perror("fopen() error");
20         exit(-1);
21     }
22     //設置為字節寬度
23     if(fwide(fp,-1) < 0)
24         printf("byte stream\n");
25     //設置為行緩沖
26     setvbuf(fp,buf,_IOLBF,BUFSIZE);
27     printf("Enter file content:\n");
28     gets(line);
29     printf("write to file.\n");
30     fputs(line,fp);
31     close(fp);
32      fp = fopen(filename,"r+");
33     if(fp == NULL)
34     {
35         perror("fopen() error");
36         exit(-1);
37     }
38     printf("read from file.\n");
39     fgets(line,99,fp);
40     printf("%s\n",line);
41     close(fp);
42     return 0;
43 }
技術分享圖片

測試結果如下:

技術分享圖片

Unix環境高級編程(三)標準I/O庫