fwrite和write的區(qū)別
首先要明白不帶緩沖的概念:所謂不帶緩沖,并不是指內(nèi)核不提供緩沖,而是只單純的系統(tǒng)調(diào)用,不是函數(shù)庫的調(diào)用。系統(tǒng)內(nèi)核對(duì)磁盤的讀寫都會(huì)提供一個(gè)塊緩沖,當(dāng)用write函數(shù)對(duì)其寫數(shù)據(jù)時(shí),直接調(diào)用系統(tǒng)調(diào)用,將數(shù)據(jù)寫入到塊緩沖進(jìn)行排隊(duì),當(dāng)塊緩沖達(dá)到一定的量時(shí),才會(huì)把數(shù)據(jù)寫入磁盤。因此所謂的不帶緩沖的I/O是指進(jìn)程不提供緩沖功能。每調(diào)用一次write或read函數(shù),直接系統(tǒng)調(diào)用。
而帶緩沖的I/O是指進(jìn)程對(duì)輸入輸出流進(jìn)行了改進(jìn),提供了一個(gè)流緩沖,當(dāng)用fwrite函數(shù)網(wǎng)磁盤寫數(shù)據(jù)時(shí),先把數(shù)據(jù)寫入流緩沖區(qū)中,當(dāng)達(dá)到一定條件,比如流緩沖區(qū)滿了,或刷新流緩沖,這時(shí)候才會(huì)把數(shù)據(jù)一次送往內(nèi)核提供的塊緩沖,再經(jīng)塊緩沖寫入磁盤
C語言fwrite怎么寫入文件?
C語言fwrite寫入文件可以參考以下的代碼:
//定義一個(gè)學(xué)生結(jié)構(gòu)體
structStudent_type
{
charname[10];
intnum;
intage;
charaddr[30];
}stud[40];
inti;
FILE*fp;//定義一個(gè)文件指針fp
fp=fopen("stu.dat","wb");//以二進(jìn)制可寫方式打開stu.dat文件
//將40個(gè)學(xué)生的記錄寫入文件stu.dat中
for(i=0;i<40;i++)
fwrite(&stud[i],sizeof(structStudent_type),1,fp);
擴(kuò)展資料:
fwrite函數(shù)用法
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
返回值:返回實(shí)際寫入的數(shù)據(jù)塊數(shù)目
1、buffer:是一個(gè)指針,對(duì)fwrite來說,是要獲取數(shù)據(jù)的地址
2、size:要寫入內(nèi)容的單字節(jié)數(shù)
3、count:要進(jìn)行寫入size字節(jié)的數(shù)據(jù)項(xiàng)的個(gè)數(shù)
4、stream:目標(biāo)文件指針
5、返回實(shí)際寫入的數(shù)據(jù)項(xiàng)個(gè)數(shù)count
說明:寫入到文件的哪里與文件的打開模式有關(guān),如果是w+,則是從file pointer指向的地址開始寫,替換掉之后的內(nèi)容,文件的長度可以不變,stream的位置移動(dòng)count個(gè)數(shù);如果是a+,則從文件的末尾開始添加,文件長度加大。
fek對(duì)此函數(shù)有作用,但是fwrite函數(shù)寫到用戶空間緩沖區(qū),并未同步到文件中,所以修改后要將內(nèi)存與文件同步可以用fflush(FILE *fp)函數(shù)同步。
參考資料來源:百度百科-fwrite
fread和fwrite的區(qū)別是什么
fwrite和fread是以記錄為單位的I/O函數(shù),fread和fwrite函數(shù)一般用于二進(jìn)制文件的輸入輸出。
fread和fwrite的函數(shù)原型分別為:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
fread和fwrite函數(shù)的返回值:
讀或?qū)懙挠涗洈?shù),成功時(shí)返回的記錄數(shù)等于nmemb,出錯(cuò)或讀到文件末尾時(shí)返回的記錄數(shù)小于nmemb,也可能返回0。
fread和fwrite函數(shù)參數(shù)的含義:
參數(shù)size指出一條記錄的長度;
參數(shù)nmemb指出要讀或?qū)懚嗌贄l記錄,這些記錄在ptr所指的內(nèi)存空間中連續(xù)存放,共占size * nmemb個(gè)字節(jié);
ptr是指向的某連續(xù)內(nèi)存空間的指針;
stream是文件指針;
fread從文件stream中讀出size * nmemb個(gè)字節(jié)保存到ptr中所指的內(nèi)存空間中;
fwrite把ptr中的size * nmemb個(gè)字節(jié)寫到文件stream中。
C語言關(guān)于fwrite函數(shù)的問題
fwrite就是寫入用的函數(shù),fread和fwrite用于讀寫各種類型的數(shù)據(jù)塊
第一個(gè)參數(shù)是讀寫數(shù)據(jù)的內(nèi)存區(qū)的指針,
第3個(gè)是項(xiàng)數(shù),
第2個(gè)是每一項(xiàng)的大小,
第4個(gè)是文件指針
fwrite返回寫出的項(xiàng)數(shù),不出錯(cuò)就等于要寫的項(xiàng)數(shù),
所以他判斷是否和1相等來判斷出錯(cuò)
他這里的(struck
address_list)應(yīng)該用sizeof(struck
address_list)
不用fopen打開fwrite也沒法寫入,
"wb"是指定fopen的怎樣打開文件,
文件如過不存在,r出錯(cuò),
a生成,并且寫入的數(shù)據(jù)都被添加到文件尾,w也生成
C語言 fwrite()和fprintf()的區(qū)別
fwrite是向流中寫入數(shù)據(jù),而fprintf是向流中寫入格式數(shù)據(jù)。兩者的共同點(diǎn)為向流中寫入數(shù)據(jù),至于區(qū)別可以看看兩者的申明:
size_tfwrite(
constvoid*buffer,
size_tsize,
size_tcount,
file*stream
);
intfprintf(
file*stream,
constchar*format[,
argument]...
);
前者fwrite寫入流stream中的數(shù)據(jù)是buffer指定的內(nèi)容,內(nèi)容的字節(jié)大小分別由size和count兩個(gè)參數(shù)來指定,因此寫入流stream中的內(nèi)容有可能是亂碼,但是有效的數(shù)據(jù)。
后者fprintf寫入流stream中的數(shù)據(jù)則由argument來指定,并且這些argument的內(nèi)容分別由format指定的格式來顯示,因此寫入stream的內(nèi)容通常來說是文本字符流,當(dāng)然,也允許寫入格式亂碼。
兩者都可以將文本寫入流stream中。比如:
fwrite("helloworld!",1,12,fp);
與
fprintf(fp,"%s","helloworld!");
等價(jià)。
關(guān)于fwrite的使用問題
我記得fwrite的返回值是 成功些如文件的個(gè)數(shù)。
假設(shè)全部寫入成功,那么返回值取決與COUNT參數(shù)
如果寫入失敗比如大小確定不對(duì)或者buffer沒指好返回應(yīng)該是0個(gè),表示沒一個(gè)寫入
返回值是成功個(gè)數(shù)。
另外,你最后要說的是size=17字節(jié)與size=20字節(jié)時(shí)吧?buffer是指針。。占一字節(jié)
qq107395975