Linux(C/C++)下的文件操作open、fopen與freopen


open是linux下的底層系統調用函數,
fopen與freopen c/c++下的標准I/O庫函數,帶輸入/輸出緩沖。
linxu下的fopen是open的封裝函數,fopen最終還是要調用底層的系統調用open。所以在linux下如果需要對設備進行明確的控制,那最好使用底層系統調用(open)
 
open對應的文件操作有:close, read, write,ioctl 等。
fopen 對應的文件操作有:fclose, fread, fwrite, freopen, fseek, ftell, rewind等。
freopen用於重定向輸入輸出流的函數,該函數可以在不改變代碼原貌的情況下改變輸入輸出環境,但使用時應當保證流是可靠的。
 
open和fopen的區別:
1,fread是帶緩沖的,read不帶緩沖.
2,fopen是標准c里定義的,open是POSIX中定義的.  
3,fread可以讀一個結構.read在linux/unix中讀二進制與普通文件沒有區別.  
4,fopen不能指定要創建文件的權限.open可以指定權限.
5,fopen返回文件指針,open返回文件描述符(整數). 
6,linux/unix中任何設備都是文件,都可以用open,read.
 
-------------------------------------------------------------------------------------------------

fopen

庫函數頭文件:<stdio.h>

函數原型:FILE * fopen(const char * path, const char * mode);

參數:

path字符串包含欲打開的文件路徑及文件名,

mode字符串則代表着流形態。

mode有下列幾種形態字符串:

"r"或"rb" 以只讀方式打開文件,該文件必須存在。

"w"或"wb" 以寫方式打開文件,並把文件長度截短為零。

"a"或"ab" 以寫方式打開文件,新內容追加在文件尾。

"r+"或"rb+"或"r+b" 以更新方式打開(讀和寫)

"w+"或"wb+"或"w+b" 以更新方式打開,並把文件長度截短為零。

"a+"或"ab+"或"a+b" 以更新方式打開,新內容追加在文件尾。

字母b表示文件時一個二進制文件而不是文本文件。(linux下不區分二進制文件和文本文件)

返回值:文件順利打開后,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,並把錯誤代碼存在errno 中。

 

fread

功能簡介:從一個文件流中讀數據,最多讀取count個元素,每個元素size字節,如果調用成功返回實際讀取到的元素個數,如果不成功或讀到文件末尾返回 0。

函數原型:size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

參 數:

buffer:用於接收數據的內存地址

size:要讀寫的字節數,單位是字節

count:要進行讀寫多少個size字節的數據項,每個元素是size字節.

stream:輸入流

返回值:

實際讀取的元素個數.如果返回值與count不相同,則可能文件結尾或發生錯誤,從ferror和feof獲取錯誤信息或檢測是否到達文件結尾.

 

fwrite

功能簡介:向文件寫入一個數據塊

函數原型:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

參數:

buffer:是一個指針,對fwrite來說,是要獲取數據的地址;

size:要寫入內容的單字節數;

count:要進行寫入size字節的數據項的個數;

stream:目標文件指針;

返回值:返回實際寫入的數據塊數目

 

fflush

功能簡介:把文件流里的所有為寫出數據立刻寫出。

函數原型:int fflush(FILE *stream);

 

fseek

功能簡介:是lseek系統調用對應的文件流函數。它在文件流里為下一次讀寫操作指定位置。

函數原型:int fseek(FILE *stream, long offset, int fromwhere);

參數:

stream為文件指針參數

offset為偏移量,正數表示正向偏移,負數表示負向偏移

fromwhere設定從文件的哪里開始偏移,可能取值為:SEEK_CUR、 SEEK_END 或 SEEK_SET

SEEK_SET: 文件開頭

SEEK_CUR: 當前位置

SEEK_END: 文件結尾

其中SEEK_SET,SEEK_CUR和SEEK_END依次為0,1和2.

返回值:

如果執行成功,stream將指向以fromwhere為基准,偏移offset(指針偏移量)個字節的位置,函數返回0。

如果執行失敗(比如offset超過文件自身大小),則不改變stream指向的位置,函數返回一個非0值。

 

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

freopen

函數原型:FILE * freopen ( const char * filename, const char * mode, FILE * stream );

參數:

filename: 要打開的文件名

mode: 文件打開的模式,和fopen中的模式(r/w)相同

stream: 文件指針,通常使用標准流文件(stdin/stdout/stderr)

返回值:

如果成功則返回該指向該stream的指針,否則為NULL。

作用:用於重定向輸入輸出流的函數,將stream中的標准輸入、輸出、錯誤或者文件流重定向為filename文件中的內容。linux下需要重定向輸出很容易使用 ./程序名 >test (>>test 追加),windows下的輸入輸出重定向可以使用freopen。
使用方法: 因為文件指針使用的是標准流文件,因此我們可以不定義文件指針。

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

這樣程序的輸入就會從標准輸入流stdin轉換到從文件"test.in"中輸入
然后使用freopen()函數以寫入方式w(write)打開輸出文件test.out,freopen("test.out", "w", stdout);程序的輸出就會從原來的標准輸出變成寫入文件"test.out"中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM