fopen()函數:
2.函數原型:
FILE * fopen(const char * path,const char * mode);
-- path: 檔案路徑,如:"F:\Visual Stdio 2012\test.txt"
-- mode: 檔案打開方式,例如:
"r" 以隻讀方式打開檔案,該檔案必須存在。
"w" 打開隻寫檔案,若檔案存在則檔案長度清為0,即該檔案内容會消失。若檔案不存在則建立該檔案。
"w+" 打開可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案内容會消失。若檔案不存在則建立該檔案。
"a" 以附加的方式打開隻寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的内容會被保留。(EOF符保留)
"a+" 以附加方式打開可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的内容會被保留。(原來的EOF符不保留)
"wb" 隻寫打開或建立一個二進制檔案,隻允許寫資料。
"wb+" 讀寫打開或建立一個二進制檔案,允許讀和寫。
"ab" 追加打開一個二進制檔案,并在檔案末尾寫資料。
"ab+"讀寫打開一個二進制檔案,允許讀,或在檔案末追加資料。
--傳回值: 檔案順利打開後,指向該流的檔案指針就會被傳回。如果檔案打開失敗則傳回NULL,并把錯誤代碼存在errno中。
fwrite()函數:
1.作用:在C語言中fwrite()函數常用語将一塊記憶體區域中的資料寫入到本地文本。
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
-- buffer:指向資料塊的指針
-- size:每個資料的大小,機關為Byte(例如:sizeof(int)就是4)
-- count:資料個數
-- stream:檔案指針
注意:傳回值随着調用格式的不同而不同:
(1) 調用格式:fwrite(buf,sizeof(buf),1,fp);
成功寫入傳回值為1(即count)
(2)調用格式:fwrite(buf,1,sizeof(buf),fp);
成功寫入則傳回實際寫入的資料個數(機關為Byte)
3. 注意事項:
寫完資料後要調用fclose()關閉流,不關閉流的情況下,每次讀或寫資料後,檔案指針都會指向下一個待寫或者讀資料位置的指針。
示例說明:
代碼1:下面代碼可将1024個字(int)寫入到文本檔案,fwrite的調用中,size是sizeof(int),count是DATA_SIZE
#include "stdafx.h"
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define DATA_SIZE 1024
int main()
{
unsigned int *dataPtr = NULL;
dataPtr = (unsigned int *)malloc(sizeof(int)*DATA_SIZE);
for(unsigned int i=0;i<DATA_SIZE;i++)
{
dataPtr[i] = i; //初始化緩存區
}
FILE *fp = fopen("F:\\Labwindows cvi\\test.txt","w");
fwrite(dataPtr,sizeof(int),DATA_SIZE,fp);
fclose(fp);
free(dataPtr);
system("pause");
return 0;
}
代碼2:下面代碼也可将1024個字寫到文本中,雖然fwrite函數中,size是1,但count是DATA_SIZE*sizeof(int)。與代碼1實作的結果一樣。
// datasave.cpp : 定義控制台應用程式的入口點。
//
FILE *fp = fopen("F:\\Labwindows cvi\\test.txt","ab+");
fwrite(dataPtr,1,DATA_SIZE*sizeof(unsigned int),fp);
<pre name="code" class="cpp"> fclose(fp);
<pre name="code" class="cpp"> free(dataPtr);
system("pause"); return 0;}
代碼3:下面的代碼将4096個char資料寫到文本,寫入的資料中,最大值為255,與上面代碼1、2有差別,因為緩存區資料類型不同
unsigned char *dataPtr = NULL;
dataPtr = (unsigned char *)malloc(sizeof(int)*DATA_SIZE); //申請的區域是4096個char,即1024個字的區域
fwrite(dataPtr,sizeof(char),DATA_SIZE*sizeof(int),fp);
fclose(fp);
代碼4:用malloc函數申請區域時是申請的一片char*區域,通過強制類型轉換後可裝unsigned int 資料。
unsigned int *Ptr = NULL;
dataPtr = (unsigned char *)malloc(sizeof(int)*DATA_SIZE);
Ptr = (unsigned int *) dataPtr;
Ptr[i] = i;
fwrite(Ptr,sizeof(unsigned int),DATA_SIZE,fp);
fclose(fp);
free(dataPtr);
system("pause");
fread()函數:
1. 作用:從一個檔案流中讀取資料
2. 函數原型如下:
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
-- buffer:指向資料塊的指針
-- size:每個資料的大小,機關為Byte(例如:sizeof(int)就是4)
-- count:資料個數
-- stream:檔案指針
(1) 調用格式:fread(buf,sizeof(buf),1,fp);
讀取成功時:當讀取的資料量正好是sizeof(buf)個Byte時,傳回值為1(即count)
否則傳回值為0(讀取資料量小于sizeof(buf))
(2)調用格式:fread(buf,1,sizeof(buf),fp);
讀取成功傳回值為實際讀回的資料個數(機關為Byte)
代碼參考:
#include <string.h>
int main(int argc, char *argv[])
FILE *filp = NULL;
char fileDir[] = "/home/yangzhiyuan/Documents/test.txt";
char dataPtr[] = "Helloworld";
printf("sizeof(dataPtr) = %ld\n",sizeof(dataPtr));
filp = fopen(fileDir,"w+"); /* 可讀可寫,不存在則建立 */
int writeCnt = fwrite(dataPtr,sizeof(dataPtr),1,filp); /* 傳回值為1 */
//int writeCnt = fwrite(dataPtr,1,sizeof(dataPtr),filp); /* 傳回值為11 */
printf("writeCnt = %d\n",writeCnt);
fclose(filp);
FILE *fp = NULL;
fp = fopen(fileDir,"r");
char buffer[256];
int readCnt = fread(buffer,sizeof(buffer),1,fp); /* 傳回值為0 */
//int readCnt = fread(buffer,1,sizeof(buffer),fp); /* 傳回值為11 */
printf("readCnt = %d\n",readCnt);
printf("%s\n",buffer);
exit(0);
注意:本例代碼中定義了兩個FILE變量,一個用于write,一個用于read,寫完後要close掉,然後再打開,然後讀。如果直接使用一個FILE變量,會出錯!