C語言以數(shù)據(jù)塊的形式讀寫文件實例代碼
fgets() 有局限性,每次最多只能從文件中讀取一行內(nèi)容,因為 fgets 遇到換行符就結(jié)束讀取。如果希望讀取多行內(nèi)容,需要使用 fread 函數(shù);相應(yīng)地寫入函數(shù)為 fwrite。
fread() 函數(shù)用來從指定文件中讀取塊數(shù)據(jù)。所謂塊數(shù)據(jù),也就是若干個字節(jié)的數(shù)據(jù),可以是一個字符,可以是一個字符串,可以是多行數(shù)據(jù),并沒有什么限制。fread() 的原型為:
size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
fwrite() 函數(shù)用來向文件中寫入塊數(shù)據(jù),它的原型為:
size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
對參數(shù)的說明:
ptr 為內(nèi)存區(qū)塊的指針,它可以是數(shù)組、變量、結(jié)構(gòu)體等。fread() 中的 ptr 用來存放讀取到的數(shù)據(jù),fwrite() 中的 ptr 用來存放要寫入的數(shù)據(jù)。
size:表示每個數(shù)據(jù)塊的字節(jié)數(shù)。
count:表示要讀寫的數(shù)據(jù)塊的塊數(shù)。
fp:表示文件指針。
理論上,每次讀寫 size*count 個字節(jié)的數(shù)據(jù)。
size_t 是在 stddef.h 頭文件中使用 typedef 定義的數(shù)據(jù)類型,表示無符號整數(shù),也即非負(fù)數(shù),常用來表示數(shù)量。
返回值:返回成功讀寫的塊數(shù),也即 count。如果返回值小于 count:
對于 fwrite() 來說,肯定發(fā)生了寫入錯誤,可以用 ferror() 函數(shù)檢測。
對于 fread() 來說,可能讀到了文件末尾,可能發(fā)生了錯誤,可以用 ferror() 或 feof() 檢測。
【示例】從鍵盤輸入一個數(shù)組,將數(shù)組寫入文件再讀取出來。
#include<stdio.h> #define N 5 int main(){ //從鍵盤輸入的數(shù)據(jù)放入a,從文件讀取的數(shù)據(jù)放入b int a[N], b[N]; int i, size = sizeof(int); FILE *fp; if( (fp=fopen("D:\\demo.txt", "rb+")) == NULL ){ printf("Cannot open file, press any key to exit!\n"); getch(); exit(1); } //從鍵盤輸入數(shù)據(jù) 并保存到數(shù)組a for(i=0; i<N; i++){ scanf("%d", &a[i]); } //將數(shù)組a的內(nèi)容寫入到文件 fwrite(a, size, N, fp); //將文件中的位置指針重新定位到文件開頭 rewind(fp); //從文件讀取內(nèi)容并保存到數(shù)組b fread(b, size, N, fp); //在屏幕上顯示數(shù)組b的內(nèi)容 for(i=0; i<N; i++){ printf("%d ", b[i]); } printf("\n"); fclose(fp); return 0; }
運行結(jié)果:
23 409 500 100 222↙
23 409 500 100 222
fwrite()/fread() 函數(shù)直接操作字節(jié),建議使用二進制方式打開文件。請閱讀《C語言中文本文件與二進制文件的區(qū)別》了解更多。
打開 D:\\demo.txt,發(fā)現(xiàn)文件內(nèi)容根本無法閱讀。這是因為我們使用"rb+"方式打開文件,數(shù)據(jù)以二進制形式寫入文件,一般無法閱讀。
數(shù)據(jù)寫入完畢后,位置指針在文件的末尾,要想讀取數(shù)據(jù),必須將文件指針移動到文件開頭,這就是rewind(fp);的作用。更多關(guān)于rewind函數(shù)的內(nèi)容請點擊:C語言rewind函數(shù)。
文件的后綴不一定是 .txt,它可以是任意的,你可以自己命名,例如 demo.ddd、demo.doc、demo.diy 等。
【示例】從鍵盤輸入兩個學(xué)生數(shù)據(jù),寫入一個文件中,再讀出這兩個學(xué)生的數(shù)據(jù)顯示在屏幕上。
#include<stdio.h> #define N 2 struct stu{ char name[10]; //姓名 int num; //學(xué)號 int age; //年齡 float score; //成績 }boya[N], boyb[N], *pa, *pb; int main(){ FILE *fp; int i; pa = boya; pb = boyb; if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){ printf("Cannot open file, press any key to exit!\n"); getch(); exit(1); } //從鍵盤輸入數(shù)據(jù) printf("Input data:\n"); for(i=0; i<N; i++,pa++){ scanf("%s %d %d %f",pa->name, &pa->num,&pa->age, &pa->score); } //將數(shù)組 boya 的數(shù)據(jù)寫入文件 fwrite(boya, sizeof(struct stu), N, fp); //將文件指針重置到文件開頭 rewind(fp); //從文件讀取數(shù)據(jù)并保存到數(shù)據(jù) boyb fread(boyb, sizeof(struct stu), N, fp); //輸出數(shù)組 boyb 中的數(shù)據(jù) for(i=0; i<N; i++,pb++){ printf("%s %d %d %f\n", pb->name, pb->num, pb->age, pb->score); } fclose(fp); return 0; }
運行結(jié)果:
Input data:
Tom 2 15 90.5↙
Hua 1 14 99↙
Tom 2 15 90.500000
Hua 1 14 99.000000
以上就是對C語言以數(shù)據(jù)塊形式讀取的實例代碼,希望能幫助學(xué)習(xí)這部分內(nèi)容的同學(xué)。
欄 目:C語言
下一篇:C++用mysql自帶的頭文件連接數(shù)據(jù)庫
本文標(biāo)題:C語言以數(shù)據(jù)塊的形式讀寫文件實例代碼
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2162.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 01-10C#中split用法實例總結(jié)
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置