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