Linux下C/C++的文件操作open、fopen與freopen-創(chuàng)新互聯(lián)

open是linux下的底層系統(tǒng)調(diào)用函數(shù),fopen與freopen c/c++下的標(biāo)準(zhǔn)I/O庫函數(shù),帶輸入/輸出緩沖。
linxu下的fopen是open的封裝函數(shù),fopen最終還是要調(diào)用底層的系統(tǒng)調(diào)用open。
所以在linux下如果需要對設(shè)備進行明確的控制,那最好使用底層系統(tǒng)調(diào)用(open),

創(chuàng)新互聯(lián)從2013年開始,公司以網(wǎng)站建設(shè)、成都網(wǎng)站制作、系統(tǒng)開發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶成百上千家,涉及國內(nèi)多個省份客戶。擁有多年網(wǎng)站建設(shè)開發(fā)經(jīng)驗。為企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計、宣傳推廣等服務(wù)。 通過專業(yè)的設(shè)計、獨特的風(fēng)格,為不同客戶提供各種風(fēng)格的特色服務(wù)。

open對應(yīng)的文件操作有:close, read, write,ioctl 等。
fopen 對應(yīng)的文件操作有:fclose, fread, fwrite, freopen, fseek, ftell, rewind等。
freopen用于重定向輸入輸出流的函數(shù),該函數(shù)可以在不改變代碼原貌的情況下改變輸入輸出環(huán)境,但使用時應(yīng)當(dāng)保證流是可靠的。詳細見第3部分。

-------------------------------------------------------------------------------------------------------------------
open和fopen的區(qū)別:
1,fread是帶緩沖的,read不帶緩沖.
2,fopen是標(biāo)準(zhǔn)c里定義的,open是POSIX中定義的.
3,fread可以讀一個結(jié)構(gòu).read在linux/unix中讀二進制與普通文件沒有區(qū)別.
4,fopen不能指定要創(chuàng)建文件的權(quán)限.open可以指定權(quán)限.
5,fopen返回文件指針,open返回文件描述符(整數(shù)).
6,linux/unix中任何設(shè)備都是文件,都可以用open,read.

-------------------------------------------------------------------------------------------------------------------

1、open系統(tǒng)調(diào)用(linux)
需要包含頭文件:#include<sys/types.h>
              #include<sys/stat.h>
              #include<fcntl.h>

函數(shù)原型:int open( const char * pathname, int oflags);
         int open( const char * pathname,int oflags, mode_t mode);

mode僅當(dāng)創(chuàng)建新文件時才使用,用于指定文件的訪問權(quán)限。

pathname 是待打開/創(chuàng)建文件的路徑名;

oflags用于指定文件的打開/創(chuàng)建模式,這個參數(shù)可由以下常量(定義于 fcntl.h)通過邏輯或構(gòu)成。
  O_RDONLY    只讀模式
  O_WRONLY    只寫模式
  O_RDWR      讀寫模式
以上三者是互斥的,即不可以同時使用。

打開/創(chuàng)建文件時,至少得使用上述三個常量中的一個。以下常量是選用的:
  O_APPEND     每次寫操作都寫入文件的末尾
  O_CREAT       如果指定文件不存在,則創(chuàng)建這個文件
  O_EXCL        如果要創(chuàng)建的文件已存在,則返回 -1,并且修改 errno 的值
  O_TRUNC      如果文件存在,并且以只寫/讀寫方式打開,則清空文件全部內(nèi)容
  O_NOCTTY     如果路徑名指向終端設(shè)備,不要把這個設(shè)備用作控制終端。
  O_NONBLOCK  如果路徑名指向 FIFO/塊文件/字符文件,則把文件的打開和后繼 I/O設(shè)置為非阻塞模式(nonblocking mode)。
//以下用于同步輸入輸出
  O_DSYNC      等待物理 I/O 結(jié)束后再 write。在不影響讀取新寫入的數(shù)據(jù)的前提下,不等待文件屬性更新。
  O_RSYNC      read 等待所有寫入同一區(qū)域的寫操作完成后再進行
  O_SYNC       等待物理 I/O 結(jié)束后再 write,包括更新文件屬性的 I/O

當(dāng)你使用帶有O_CREAT標(biāo)志的open調(diào)用來創(chuàng)建文件時,你必須使用有3個參數(shù)格式的open調(diào)用。第三個參數(shù)mode是幾個標(biāo)志按位或后得到的,
這些標(biāo)志在頭文件sys/stat.h中定義,如下所示:
 S_IRUSR:   讀權(quán)限,文件屬主
 S_IWUSR:  寫權(quán)限,文件屬主
 S_IXUSR:   執(zhí)行權(quán)限,文件屬主
 S_IRGRP:   讀權(quán)限,文件所屬組
 S_IWGRP:  寫權(quán)限,文件所屬組
 S_IXGRP:   執(zhí)行權(quán)限,文件所屬組
 S_IROTH:  讀權(quán)限,其它用戶
 S_IWOTH:  寫權(quán)限,其它用戶
 S_IXOTH:  執(zhí)行權(quán)限,其它用戶

返回值:成功則返回文件描述符,否則返回 -1。  返回文件描述符(整型變量0~255)。由open 返回的文件描述符一定是該進程尚未使用的最小描述符。只要有一個權(quán)限被禁止則返回-1。
錯誤代碼:(均已E開頭,將其去掉就是有關(guān)于錯誤的方面的單詞或單詞的縮寫)
 EEXIST 參數(shù)pathname 所指的文件已存在,卻使用了O_CREAT和O_EXCL旗標(biāo)。
 EACCESS 參數(shù)pathname所指的文件不符合所要求測試的權(quán)限。
 EROFS 欲測試寫入權(quán)限的文件存在于只讀文件系統(tǒng)內(nèi)。

 EFAULT 參數(shù)pathname指針超出可存取內(nèi)存空間。

 EINVAL 參數(shù)mode 不正確。
  ENAMETOOLONG 參數(shù)pathname太長。

 ENOTDIR 參數(shù)pathname不是目錄。
 ENOMEM 核心內(nèi)存不足。
 ELOOP 參數(shù)pathname有過多符號連接問題。
 EIO I/O 存取錯誤。

-------------------------------------------------------------------------------------------------------------------
ssize_t write(int fd, const void *buf, size_t count);
參數(shù)
fd:要進行寫操作的文件描述詞。
buf:需要輸出的緩沖區(qū)
count:大輸出字節(jié)計數(shù)

返回值:成功返回寫入的字節(jié)數(shù),出錯返回-1并設(shè)置errno
-----------------------------------------------.--------------------------------------------------------------------
ssize_t read(int fd, void *buf, size_t count);
參數(shù)
buf:需要讀取的緩沖區(qū)
count:大讀取字節(jié)計數(shù)   

返回值:成功返回讀取的字節(jié)數(shù),出錯返回-1并設(shè)置errno,如果在調(diào)read之前已到達文件末尾,則這次read返回0 。

-------------------------------------------------------------------------------------------------------------------

2、fopen庫函數(shù)
頭文件:<stdio.h>
函數(shù)原型:FILE * fopen(const char * path, const char * mode);
path字符串包含欲打開的文件路徑及文件名,參數(shù)mode字符串則代表著流形態(tài)。
mode有下列幾種形態(tài)字符串:
"r"或"rb"     以只讀方式打開文件,該文件必須存在。
"w"或"wb"   以寫方式打開文件,并把文件長度截短為零。
"a"或"ab"    以寫方式打開文件,新內(nèi)容追加在文件尾。
"r+"或"rb+"或"r+b"    以更新方式打開(讀和寫)
"w+"或"wb+"或"w+b"  以更新方式打開,并把文件長度截短為零。
"a+"或"ab+"或"a+b"   以更新方式打開,新內(nèi)容追加在文件尾。
字母b表示文件時一個二進制文件而不是文本文件。(linux下不區(qū)分二進制文件和文本文件)
返回值:文件順利打開后,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,并把錯誤代碼存在errno 中。

-------------------------------------------------------------------------------------------------------------------
fread是一個函數(shù)。從一個文件流中讀數(shù)據(jù),最多讀取count個元素,每個元素size字節(jié),如果調(diào)用成功返回實際讀取到的元素個數(shù),如果不成功或讀到文件末尾返回 0。
函數(shù)原型:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
參 數(shù):
buffer:用于接收數(shù)據(jù)的內(nèi)存地址
size:要讀寫的字節(jié)數(shù),單位是字節(jié)
count:要進行讀寫多少個size字節(jié)的數(shù)據(jù)項,每個元素是size字節(jié).
stream:輸入流
返回值:實際讀取的元素個數(shù).如果返回值與count不相同,則可能文件結(jié)尾或發(fā)生錯誤,從ferror和feof獲取錯誤信息或檢測是否到達文件結(jié)尾.
-------------------------------------------------------------------------------------------------------------------
fwrite:向文件寫入一個數(shù)據(jù)塊
函數(shù)原型:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
參數(shù):
buffer:是一個指針,對fwrite來說,是要獲取數(shù)據(jù)的地址;
size:要寫入內(nèi)容的單字節(jié)數(shù);
count:要進行寫入size字節(jié)的數(shù)據(jù)項的個數(shù);
stream:目標(biāo)文件指針;
返回值:返回實際寫入的數(shù)據(jù)塊數(shù)目
-------------------------------------------------------------------------------------------------------------------
fflush:把文件流里的所有為寫出數(shù)據(jù)立刻寫出。
函數(shù)原型:int fflush(FILE *stream);
-------------------------------------------------------------------------------------------------------------------
fseek:是lseek系統(tǒng)調(diào)用對應(yīng)的文件流函數(shù)。它在文件流里為下一次讀寫操作指定位置。
函數(shù)原型:int fseek(FILE *stream, long offset, int fromwhere);
參數(shù)stream為文件指針
參數(shù)offset為偏移量,正數(shù)表示正向偏移,負數(shù)表示負向偏移
參數(shù)fromwhere設(shè)定從文件的哪里開始偏移,可能取值為:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件開頭
SEEK_CUR: 當(dāng)前位置
SEEK_END: 文件結(jié)尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次為0,1和2.
返回值:如果執(zhí)行成功,stream將指向以fromwhere為基準(zhǔn),偏移offset(指針偏移量)個字節(jié)的位置,函數(shù)返回0。如果執(zhí)行失敗(比如offset超過文件自身大小),則不改變stream指向的位置,函數(shù)返回一個非0值。

-------------------------------------------------------------------------------------------------------------------

以下為linux下一個打開文件并顯示文件內(nèi)容的程序:

  1. #include <stdio.h>  
    #include <stdlib.h>  
    #include <unistd.h>  
    #include <fcntl.h>  
    #include <string.h>  
    #include <sys/types.h>  
    #include <sys/stat.h>  
      
      
    charchar * FILE_NAME = "/home/hzg/uart/download.bin";     
    unsigned char file_buffer[20];  
      
      
    int main()  
    {  
        FILEFILE * file_fd;  
        int read_len, i;  
      
        file_fd = fopen(FILE_NAME,"rb");  
        if(file_fd == NULL)  
        {  
           perror("errno");  
        }  
        else   
        {  
           printf("File Open successed!\n");  
        }  
      
        while(1)  
        {  
           read_len = fread(file_buffer, 1, 16, file_fd);  
             
           if(read_len == -1)  
           {  
               printf("File read error!\n");  
               perror("errno");  
               exit(0);  
           }  
           else if(read_len == 0)  
           {  
               printf("File read Over!\n");  
               break;  
           }  
           else   
           {  
               printf("Read %d Byte From download.bin: ",read_len);  
               for(i = 0; i < read_len; i++)  
               {  
                    printf(" %02x",file_buffer[i]);  
               }  
               printf("\n");  
           }  
          
           usleep(20000);  
        }  
      
        fclose(file_fd);  
        return 0;  
    }

3、freopen
函數(shù)原型:FILE * freopen ( const char * filename, const char * mode, FILE * stream );
參數(shù)
filename: 要打開的文件名
mode: 文件打開的模式,和fopen中的模式(r/w)相同
stream: 文件指針,通常使用標(biāo)準(zhǔn)流文件(stdin/stdout/stderr)
返回值:如果成功則返回該指向該stream的指針,否則為NULL。
作用:用于重定向輸入輸出流的函數(shù),將stream中的標(biāo)準(zhǔn)輸入、輸出、錯誤或者文件流重定向為filename文件中的內(nèi)容。linux下需要重定向輸出很容易使用 ./程序名 >test (>>test 追加),windows下的輸入輸出重定向可以使用freopen。

使用方法:因為文件指針使用的是標(biāo)準(zhǔn)流文件,因此我們可以不定義文件指針。

我們使用freopen()函數(shù)以只讀方式r(read)打開輸入文件test.in ,freopen("test.in", "r", stdin);

這樣程序的輸入就會從標(biāo)準(zhǔn)輸入流stdin轉(zhuǎn)換到從文件"test.in"中輸入

然后使用freopen()函數(shù)以寫入方式w(write)打開輸出文件test.out,freopen("test.out", "w", stdout);
程序的輸出就會從原來的標(biāo)準(zhǔn)輸出變成寫入文件"test.out"中

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享名稱:Linux下C/C++的文件操作open、fopen與freopen-創(chuàng)新互聯(lián)
文章源于:http://www.bm7419.com/article40/dpcjho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)定制網(wǎng)站、品牌網(wǎng)站建設(shè)、Google網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化