今天,簡要的介紹一下,在linux中,用c語言進行I/O操作學習! 我們知道在unix下進行檔案I/O操作,有2種方法,可以使用ISO C標準中的標準庫函數來進行檔案操作!也可以調用系統函數來實現!
我現在使用標準c函數庫來實現!
首先,要說的是,利用標準函數庫是帶緩衝的!也就是說緩衝區大小的設定,系統已經設定好了,你不需要自己去考慮!
使用標準函數庫,例如,當我們建立一個檔案或者是開啟一個檔案時,我們用的是一個流與檔案相關連,而在系統調用中我們使用的是檔案描述符來關聯的!
對於緩衝,標準I/O有三種類型!
1) 全緩衝.在這中條件下,只用當系統的緩衝區填滿時才能夠進行I/O操作,通常來說對於位於磁碟上的檔案進行的是全緩衝!
2) 行緩衝,在這中條件下,當輸入和輸出中遇到分行符號時,進行I/O操作,它允許我們一次輸出一個字元,但是只有寫了一行之後,才能進行實際的I/O,當流涉及到了終端時(如標準輸入,標準輸出)
進行的是行緩衝!(注意當緩衝被寫滿得時候,不管遇到分行符號時都要進行I/O 操作!
3)不帶緩衝,即直接將資料寫到檔案中去!(對於標準出錯流通常是不帶緩衝的,這樣是為了更好更快的顯示出錯的資訊!)
首先介紹一下開啟檔案流的函數!
常見的有
1) FILE *fopen(const char *restrict filename,const char *restrict type);//The fopen() function shall open the file whose pathname is the string pointed to by filename, and associates a stream with it.
2) FiLE*freopen(const char *restrict pathname,const char *restrict type);//進行的是流的定向,常見的用法是將標準輸入和標準輸出定向成有pathname 指定的檔案中!
3) FILE *fdopen(int fiedes,const char * type );//filedes是檔案描述符! 此函數擷取的是一個現有的檔案描述符,並使一個I/O流與該描述符相關聯!通常由建立管道和通訊通道函數返回的描述符!
利用 fopen 函數,開啟一個檔案,將其中的內容複寫到裡 另一個檔案中去!
View Code
1 #include<stdio.h> 2 int main() 3 { 4 FILE *fd; 5 FILE *fd1; 6 fd=fopen("/home/chenming/main1.cpp","r"); 7 fd1=fopen("/home/chenming/test.c","w"); 8 int c; 9 while((c=getc(fd))!=EOF)10 if(putc(c,fd1)==EOF)11 printf("error\n");12 13 14 15 16 return 0;17 }
利用 freopen 函數將標準輸入和標準輸出重新導向成兩個檔案中去!
View Code
1 #include<stdio.h> 2 int main() 3 { 4 freopen("/home/chenming/main1.cpp","r",stdin); 5 freopen("/home/chenming/test.c","w",stdout); 6 int c; 7 while((c=getc(stdin))!=EOF) 8 if(putc(c,stdout)==EOF) 9 printf("error\n");10 11 12 13 14 return 0;15 }
上面的代碼涉及到了讀和寫的流的函數,下面總結一下這些函數!
一旦開啟流,就要進行常見的讀寫操作!
1) 一次一個字元的I/O操作
在標準輸入輸出庫裡面給我們提供了幾種方法!
輸入函數有
int getc(FILE *fp)//可被實現為一個宏//
int fgetc(FILE *fp)//只能被實現一個函數,不能被實現為一個宏
int getchar(void)//相當於 getc(stdin)
出錯將返回EOF
對應的輸出函數有
int putc(int c,FILE *fp)
int fputc(int c,FILE *fp)
int putchar(int c)
前面已經說明了怎麼用了,現在就不在說了!
2)每行的I/O操作
對於輸入有:
char * fgets(char *buf,int n,FILE *fp)//成功則返回buf,若出錯,或者已經到達檔案尾則返回NULL,其中n為緩衝區的大小!
char *gets(char *buf)//不推薦使用這個,因為沒有規定緩衝區的大小,可能溢出!
對於輸出有:
int fputs(const char *buf, FILE *fp)
int puts(const char *buf)//同樣不推薦使用這個函數
請看下面的用法
View Code
1 #include <stdio.h> 2 #define maxn 100 3 int main() 4 { 5 char buf[maxn]; 6 while(fgets(buf,maxn,stdin)!=NULL) 7 if(fputs(buf,stdout)==EOF) 8 printf("output error\n"); 9 if(ferror(stdin))10 printf("input error\n");11 return 0;12 }