C语言文件读写操作主要函数及其用例
C語言把磁盤文件看成是字符(或字節(jié))的序列,按照存儲信息的形式來說,文件主要是有文本文件和二進(jìn)制文件。文本文件由一個個字符組成,每個字節(jié)存放一個ASCII碼制,代表一個字符。二進(jìn)制文件把內(nèi)存中的數(shù)據(jù)按其在內(nèi)存中的存儲形式原樣放入磁盤空間。
二進(jìn)制文件以及文本文件都可以看做是“數(shù)據(jù)流”。
流文件的特點是,處理時不需考慮文件中的數(shù)據(jù)的性質(zhì)、類型和存放格式。訪問時只是以字節(jié)為單位對數(shù)據(jù)進(jìn)行存取,沒有記錄的概念,而將對數(shù)據(jù)結(jié)構(gòu)的分析、處理等工作都交給后續(xù)程序區(qū)處理。系統(tǒng)會自動為這在使用的每個文件開辟一個緩存區(qū),從內(nèi)存向磁盤輸出數(shù)據(jù)必須先送到內(nèi)存中的緩存區(qū),裝滿緩存后才一起送到磁盤。
?
一、文件的打開與關(guān)閉
?? 文件在進(jìn)行讀寫操作之前要先打開,使用完畢要關(guān)閉。所謂打開文件,實際上是建立文件的各種有關(guān)信息,并使文件指針指向該文件,以便進(jìn)行其它操作。關(guān)閉文件則斷開指針與文件之間的聯(lián)系,也就禁止再對該文件進(jìn)行操作。
fopen函數(shù)用來打開一個文件,其調(diào)用的一般形式為:
文件指針名=fopen(文件名,使用文件方式);
其中:
“文件指針名”必須是被說明為FILE 類型的指針變量;
“文件名”是被打開文件的文件名;
“使用文件方式”是指文件的類型和操作要求。
“文件名”是字符串常量或字符串?dāng)?shù)組。
使用文件的方式共有12種,下面給出了它們的符號和意義。
“r”
只讀打開一個文本文件,只允許讀數(shù)據(jù)
“w”
只寫打開或建立一個文本文件,只允許寫數(shù)據(jù)
“a”
追加打開一個文本文件,并在文件末尾寫數(shù)據(jù)
“rb”
只讀打開一個二進(jìn)制文件,只允許讀數(shù)據(jù)
“wb”
只寫打開或建立一個二進(jìn)制文件,只允許寫數(shù)據(jù)
“ab”
追加打開一個二進(jìn)制文件,并在文件末尾寫數(shù)據(jù)
“r+”
讀寫打開一個文本文件,允許讀和寫
“w+”
讀寫打開或建立一個文本文件,允許讀寫
“a+”
讀寫打開一個文本文件,允許讀,或在文件末追加數(shù)據(jù)
“rb+”
讀寫打開一個二進(jìn)制文件,允許讀和寫
“wb+”
讀寫打開或建立一個二進(jìn)制文件,允許讀和寫
“ab+”
讀寫打開一個二進(jìn)制文件,允許讀,或在文件末追加數(shù)據(jù)
對于文件使用方式有以下幾點說明:
1) 文件使用方式由r,w,a,t,b,+六個字符拼成,各字符的含義是:
r(read): 讀
w(write): 寫
a(append): 追加
t(text): 文本文件,可省略不寫
b(banary): 二進(jìn)制文件
+: 讀和寫
2) 凡用“r”打開一個文件時,該文件必須已經(jīng)存在,且只能從該文件讀出。
3) 用“w”打開的文件只能向該文件寫入。若打開的文件不存在,則以指定的文件名建立該文件,若打開的文件已經(jīng)存在,則將該文件刪去,重建一個新文件。
4) 若要向一個已存在的文件追加新的信息,只能用“a”方式打開文件。但此時該文件必須是存在的,否則將會出錯。
5) 在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,并作相應(yīng)的處理。
二、文件的讀寫
對文件的讀和寫是最常用的文件操作。在C語言中提供了多種文件讀寫的函數(shù):
·字符讀寫函數(shù) :fgetc和fputc
·字符串讀寫函數(shù):fgets和fputs
·數(shù)據(jù)塊讀寫函數(shù):freed和fwrite
·格式化讀寫函數(shù):fscanf和fprinf
下面分別予以介紹。使用以上函數(shù)都要求包含頭文件stdio.h。
(1)字符讀寫函數(shù) :fgetc和fputc
·fgetc函數(shù)的功能是從指定的文件中讀一個字符,函數(shù)調(diào)用的形式為:
??? 字符變量=fgetc(文件指針);
??? 對于fgetc函數(shù)的使用有以下幾點說明:
??? 1) 在fgetc函數(shù)調(diào)用中,讀取的文件必須是以讀或讀寫方式打開的。
??? 2) 讀取字符的結(jié)果也可以不向字符變量賦值, 例如: fgetc(fp); 但是讀出的字符不能保存。
??? 3) 在文件內(nèi)部有一個位置指針。用來指向文件的當(dāng)前讀寫字節(jié)。在文件打開時,該指針總是指向文件的第一個字節(jié)。使用fgetc 函數(shù)后,該位置指針將向后移動一個字節(jié)。因此可連續(xù)多次使用fgetc函數(shù),讀取多個字符。應(yīng)注意文件指針和文件內(nèi)部的位置指針不是一回事。文件指針是指向整個文件的,須在程序中定義說明,只要不重新賦值,文件指針的值是不變的。文件內(nèi)部的位置指針用以指示文件內(nèi)部的當(dāng)前讀寫位置,每讀寫一次,該指針均向后移動,它不需在程序中定義說明,而是由系統(tǒng)自動設(shè)置的。
·fputc函數(shù)的功能為向指定的文件中寫入一個字符,函數(shù)調(diào)用的形式為:
??? fputc(字符量,文件指量或變量),
??? 例如:
??? fputc('a',fp);
??? 其意putc函數(shù)的使用也要說明幾點:
??? 1) 被寫入的文件可以用寫、讀寫、追加方式打開,用寫或讀寫方式寫入字符從文件首開始。如需保留原有文件內(nèi)容,希望寫入的字符被寫入的文件若不存在,則創(chuàng)建該文件。
??? 2) 每寫入一個字符,文件內(nèi)部位置指針向后移動一個字節(jié)。
??? 3) fputc函數(shù)有一個返回值,如寫入成功則返回寫入的字符,否則返回一個EOF。可用此來判斷寫符,寫入一個文件,再把該文件內(nèi)容讀出顯示在屏幕上。
【示例程序】
#include <stdio.h>
#include <stdlib.h>
#define MAXLEN 1024
main()
{
??? FILE *fpr = fopen("1.txt","r");
??? FILE *fpw = fopen("2.txt","a+");
??? char *arrayCh = NULL;
??? char ch;
??? if(NULL == fpr){
??????? printf("1.txt open failed!\n");
??????? exit(1);
??? }
??? if(NULL == fpw){
??????? printf("2.txt open failed!\n");
??????? exit(1);
??? }
??? printf("Both file open successd!\n");
??? while((ch = fgetc(fpr)) != EOF){
??????? fputc(ch,fpw);
??? }
??? while((ch = fgetc(fpw)) != EOF){
??????? printf("%c",ch);
??? }
??? fclose(fpw);
??? fclose(fpr);
??? exit(0);
}
(2) 字符串讀寫函數(shù):fgets和fputs
·fgets函數(shù)的功能是從指定的文件中讀一個字符串到字符數(shù)組中,函數(shù)調(diào)用的形式為:
??? fgets(字符數(shù)組名,n,文件指針);
??? 其中的n是一個正整數(shù)。表示從文件中讀出的字符串不超過 n-1個字符。在讀入的最后一個字符后加上串結(jié)束標(biāo)志'\0'。
??? 例如:fgets(str,n,fp);的意義是從fp所指的文件中讀出n-1個字符送入字符數(shù)組str中。
??? 對fgets函數(shù)有兩點說明:
1). 在讀出n-1個字符之前,如遇到了換行符或EOF,則讀出結(jié)束。
2). fgets函數(shù)也有返回值,其返回值是字符數(shù)組的首地址。
·fputs函數(shù)的功能是向指定的文件寫入一個字符串,其調(diào)用形式為:
??? fputs(字符串,文件指針) 其中字符串可以是字符串常量,也可以是字符數(shù)組名 或 指針變量,
??? 例如:
??? fputs(“abcd“,fp);其意義是把字符串“abcd”寫入fp所指的文件之中。
【程序示例】
#include<stdio.h>
#include<stdlib.h>
main()
{
??? char str[11];
??? FILE *fpr = fopen("1.txt","r");???
??? FILE *fpw = fopen("2.txt","a+");
??? if(NULL == fpr){
??????? printf("1.txt open failed!\n");
??????? exit(1);
??? }
??? if(NULL == fpw){
??????? printf("2.txt open failed!\n");
??????? exit(1);
??? }
??? printf("file open successed!\n");
??? fgets(str,11,fpr);
??? printf("%s\n",str);
??? fputs(str,fpw);
??? fclose(fpr);
??? fclose(fpw);
??? exit(0);
}
(3)數(shù)據(jù)塊讀寫函數(shù):fread和fwrite
C語言還提供了用于整塊數(shù)據(jù)的讀寫函數(shù)。 可用來讀寫一組數(shù)據(jù),如一個數(shù)組元素,一個結(jié)構(gòu)變量的值等。
·讀數(shù)據(jù)塊函數(shù)fread調(diào)用的一般形式為: fread(buffer,size,count,fp);
·寫數(shù)據(jù)塊函數(shù)fwrite調(diào)用的一般形式為: fwrite(buffer,size,count,fp);
??? 其中buffer是一個指針,在fread函數(shù)中,它表示存放輸入數(shù)據(jù)的首地址。在fwrite函數(shù)中,它表示存放輸出數(shù)據(jù)的首地址。 size 表示數(shù)據(jù)塊的字節(jié)數(shù)。count 表示要讀寫的數(shù)據(jù)塊塊數(shù)。fp 表示文件指針。
【程序示例】
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 2
struct stu{
??? char name[20];
??? int age;
??? char addr[20];
}boy[MAXSIZE];
main()
{
??? FILE *fp = fopen("2.txt","w+");
??? struct stu rboy[MAXSIZE];
??? int i;
??? int temp = 0;
??? if(NULL == fp){
??????? printf("2.txt open failed!\n");
??????? exit(1);
??? }
??? printf("File open successed!\n");
??? printf("input data: ");
??? for(i = 0;i < MAXSIZE;i++){
??????? scanf("%s%d%s",boy[i].name,&boy[i].age,boy[i].addr);
??? }
??? for(i = 0;i < MAXSIZE;i++){
??????? printf("%s? %d? %s\n",boy[i].name,boy[i].age,boy[i].addr);
??? }
??? fwrite(boy,sizeof(struct stu),MAXSIZE,fp);
??? rewind(fp);
??? fread(rboy,sizeof(struct stu),MAXSIZE,fp);
??? for(i = 0;i < MAXSIZE;i++){
??????? printf("name:%s? age:%d? addr:%s\n",rboy[i].name,rboy[i].age,rboy[i].addr);
??? }
??? fclose(fp);
??? exit(0);
}
(4)格式化讀寫函數(shù):fscanf和fprinf
fscanf函數(shù),fprintf函數(shù)與scanf和printf 函數(shù)的功能相似,都是格式化讀寫函數(shù)。 兩者的區(qū)別在于 fscanf 函數(shù)和fprintf函數(shù)的讀寫對象不是鍵盤和顯示器,而是磁盤文件。
這兩個函數(shù)的調(diào)用格式為:?
·fscanf(文件指針,格式字符串,輸入表列);
·fprintf(文件指針,格式字符串,輸出表列);
例如:
fscanf(fp,"%d%s",&i,s);
fprintf(fp,"%d%c",j,ch);
【示例程序】
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 2
struct stu{
??? char name[20];
??? int age;
??? char addr[20];
}boy[MAXSIZE];
main()
{???
??? FILE *fp = fopen("2.txt","w+");
??? struct stu rboy[MAXSIZE];
??? int i;
??? if(NULL == fp){
??????? printf("2.txt open failed!\n");
??????? exit(1);
??? }
??? printf("enter data:\n");
??? for(i = 0;i < MAXSIZE;i++){
??????? scanf("%s%d%s",boy[i].name,&boy[i].age,boy[i].addr);
??? }
??? for(i = 0;i < MAXSIZE;i++){
??????? fprintf(fp,"%s %d %s\n",boy[i].name,boy[i].age,boy[i].addr);
??? }
??? for(i = i;i < MAXSIZE;i++){
??????? fscanf(fp,"%s%d%s",rboy[i].name,&rboy[i].age,rboy[i].addr);
??? }
??? fclose(fp);
??? exit(0);
}
總結(jié)
以上是生活随笔為你收集整理的C语言文件读写操作主要函数及其用例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新手必知20点VC技巧【转】
- 下一篇: 【转】 LSD(Line Segment