linux 下c 語言進行檔案I/O 操作學習(一)!

來源:互聯網
上載者:User

  今天,簡要的介紹一下,在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 }

 

   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.