一.基礎知識
在C語言中,檔案操作有四個步驟:
① 定義檔案指標;
② 打開檔案:檔案指標指向磁盤檔案緩沖區;
③ 檔案處理:檔案讀寫操作;
④ 關閉檔案,
檔案打開函式如下:
fp=fopen("檔案名","檔案打開方式")
其功能是:使檔案指標fp與相應檔案物體對應起來,程式對檔案指標進行操作,即fp代表磁盤檔案,
函式fopen()若執行成功,則回傳包含檔案緩沖區等資訊的FILE型地址,賦給檔案指標fp;若不成功,則回傳一個NULL(空值),
檔案關閉函式如下:
fclose(檔案指標)
其功能是:把緩沖區中的資料寫入磁盤扇區,確保寫檔案的正常完成;釋放檔案緩沖區單元和FILE結構體,使檔案指標與具體檔案脫鉤,
若正常關閉檔案,函式fclose()的回傳值為0;若無法正常關閉檔案,回傳非0,
檔案讀寫函式包括
字符讀寫函式: fgetc() / fputc()
字串讀寫函式:fputs() / fgets()
格式化讀寫函式:fscanf() / fprintf()
二進制讀寫函式:fread ()/ fwrite()
其他相關函式:
檢測檔案結尾函式feof()
檔案定位的函式fseek() 、rewind()
各函式的呼叫格式示例如下:
ch = fgetc( fp ) ;
從fp所指示的磁盤檔案上讀入一個字符到ch
fputc(ch, fp);
把一個字符 ch 寫到 fp 所指示的磁盤檔案上
fgets(s, n, fp);
從文本檔案中讀取字串,其中,s可以是字符陣列名或字符指標;n指定讀入的字符個數;fp代表檔案指標,
函式被呼叫時,最多讀取n-1個字符,并將讀入的字串存入s所指向記憶體地址開始的n-1個連續的記憶體單元中,
當函式讀取的字符達到指定的個數,或接收到換行符,或接收到檔案結束標志EOF時,將在讀取的字符后面自動添加一個’\0’字符;若有換行符,則將換行符保留(換行符在’\0’字符之前);若有EOF,則不保留,
fputs(s, fp);
向指定的文本檔案寫入一個字串s,字串s中的結束符’\0’不寫入檔案,
fscanf(檔案指標,格式字串,輸入表);
fprintf(檔案指標,格式字串,輸出表);
指定格式的輸入輸出函式,
fread(buffer, size, count, fp);
從二進制檔案中讀入一個資料塊到變數
fwrite(buffer, size, count, fp);
向二進制檔案中寫入一個資料塊
其中,四個引數說明如下:
buffer:指標,表示存放資料的首地址;
size:資料塊的位元組數;
count:要讀寫的資料塊塊數;
fp:檔案指標,
feof(fp) ;
判斷fp指標是否已經到檔案末尾,若到檔案結束位置,函式回傳值1;若檔案未結束,函式回傳值0,
rewind(fp);
定位檔案指標,使檔案指標指向讀寫檔案的首地址,即打開檔案時檔案指標所指向的位置,
fseek(fp, offset, from);
其中,offset為移動偏移量,long型;from表示起始位置,檔案首部、當前位置和檔案尾部分別對應0,1,2,或常量SEEK_SET、SEEK_CUR、SEEK_END,
例如:fseek(fp, 20L, 0):將檔案位置指標移動到離檔案首20位元組處;fseek(fp, -20L, SEEK_END):將檔案位置指標移動到離檔案尾部前20位元組處,
二.程式填空題練習題
1.給定程式中,函式fun的功能是:將指定源檔案中的內容復制到指定的目標檔案中,復制成功時函式回傳值為1,失敗時回傳值為0,
請在下劃線處填入正確的內容并將下劃線洗掉,使程式得出正確的結果,
注意:不得增行或刪行,也不得更改程式的結構!
#include <stdio.h>
#include <stdlib.h>
int fun(char *source, char *target)
{
FILE *fs,*ft;
char ch;
/**********found**********/
if((fs=fopen(source, ___1___))==NULL)
return 0;
if((ft=fopen(target, "w"))==NULL)
return 0;
printf("\nThe data in file :\n");
ch=fgetc(fs);
/**********found**********/
while(!feof(___2___))
{
putchar( ch );
/**********found**********/
fputc(ch,___3___);
ch=fgetc(fs);
}
fclose(fs);
fclose(ft);
printf("\n\n");
return 1;
}
int main()
{
char sfname[20] ="myfile1",tfname[20]="myfile2";
FILE *myf;
int i;
char c;
myf=fopen(sfname,"w");
printf("\nThe original data :\n");
for(i=1; i<30; i++)
{
c='A'+rand()%25;
fprintf(myf,"%c",c);
printf("%c",c);
}
fclose(myf);
printf("\n\n");
if (fun(sfname, tfname)) printf("Succeed!");
else printf("Fail!");
return 0;
}
2.給定程式中,函式fun的功能是:將引數給定的字串、整數、浮點數寫到文本檔案中,再用字符方式從此文本檔案中讀入,并呼叫庫函式atoi和atof將字串轉換成相應的整數、浮點數,然后將其顯示在螢屏上,
請在下劃線處填入正確的內容并將下劃線洗掉,使程式得出正確的結果,
注意:不得增行或刪行,也不得更改程式的結構!
#include <stdio.h>
#include <stdlib.h>
void fun(char *s, int a, double f)
{
/**********found**********/
__1__ fp;
char str[100], str1[100], str2[100];
int a1;
double f1;
fp = fopen("file1.txt", "w");
fprintf(fp, "%s %d %f\n", s, a, f);
/**********found**********/
__2__ ;
fp = fopen("file1.txt", "r");
/**********found**********/
fscanf(__3__,"%s%s%s", str, str1, str2);
fclose(fp);
a1 = atoi(str1);
f1 = atof(str2);
printf("\nThe result :\n%s %d %f\n",str,a1,f1);
}
int main()
{
char a[10]="Hello!";
int b=12345;
double c= 98.76;
fun(a,b,c);
return 0;
}
3.給定程式中,函式fun的功能是:將形參給定的字串、整數、浮點數寫到文本檔案中,再用字符方式從此文本檔案中逐個讀入并顯示在螢屏上,
請在下劃線處填入正確的內容并將下劃線洗掉,使程式得出正確的結果,
注意:不得增行或刪行,也不得更改程式的結構!
#include <stdio.h>
void fun(char *s, int a, double f)
{
/**********found**********/
__1__ fp;
char ch;
fp = fopen("file1.txt", "w");
fprintf(fp, "%s %d %f\n", s, a, f);
fclose(fp);
fp = fopen("file1.txt", "r");
printf("\nThe result :\n\n");
ch = fgetc(fp);
/**********found**********/
while (!feof(__2__))
{
/**********found**********/
putchar(__3__); ch = fgetc(fp);
}
putchar('\n');
fclose(fp);
}
int main()
{
char a[10]="Hello!";
int b=12345;
double c= 98.76;
fun(a,b,c);
return 0;
}
4.給定程式中,函式fun的功能是:將自然數1~10以及它們的平方根保存到名為myfile3.txt的文本檔案中,然后再順序讀出顯示在螢屏上,
請在下劃線處填入正確的內容并將下劃線洗掉,使程式得出正確的結果,
注意:不得增行或刪行,也不得更改程式的結構!
#include <stdio.h>
#include <math.h>
int fun(char *fname )
{
FILE *fp;
int i,n;
float x;
if((fp=fopen(fname,"w"))==NULL) return 0;
for(i=1;i<=10;i++)
/**********found**********/
fprintf(___1___,"%d %f\n",i,sqrt((double)i));
printf("\nSucceed!!\n");
/**********found**********/
___2___;
printf("\nThe data in file :\n");
/**********found**********/
if((fp=fopen(___3___,"r"))==NULL)
return 0;
fscanf(fp,"%d%f",&n,&x);
while(!feof(fp))
{
printf("%d %f\n",n,x);
fscanf(fp,"%d%f",&n,&x);
}
fclose(fp);
return 1;
}
int main()
{
char fname[]="myfile3.txt";
fun(fname);
return 0;
}
5.給定程式的功能是:從鍵盤輸入若干行文本(每行不超過80個字符),寫到檔案myfile4.txt中,用-1(獨立一行)作為字串輸入結束的標志,然后將檔案的內容讀出顯示在螢屏上,
請在下劃線處填入正確的內容并將下劃線洗掉,使程式得出正確的結果,
注意:不得增行或刪行,也不得更改程式的結構!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void WriteText(FILE *);
void ReadText(FILE *);
int main()
{
FILE *fp;
if((fp=fopen("myfile4.txt","w"))==NULL)
{ printf(" open fail!!\n"); exit(0); }
WriteText(fp);
fclose(fp);
if((fp=fopen("myfile4.txt","r"))==NULL)
{ printf(" open fail!!\n"); exit(0); }
ReadText(fp);
fclose(fp);
}
/**********found**********/
void WriteText(FILE ___1___)
{
char str[81];
printf("\nEnter string with -1 to end :\n");
gets(str);
while(strcmp(str,"-1")!=0)
{
/**********found**********/
fputs(___2___,fw); fputs("\n",fw);
gets(str);
}
}
void ReadText(FILE *fr)
{
char str[81];
printf("\nRead file and output to screen :\n");
fgets(str,81,fr);
while( !feof(fr) )
{
/**********found**********/
printf("%s",___3___);
fgets(str,81,fr);
}
}
6.給定程式的功能是呼叫函式fun建立班級通訊錄,通訊錄中記錄每位學生的編號、姓名和電話號碼,班級的人數和學生的資訊從鍵盤讀入,每個人的資訊作為一個資料塊寫到名為myfile5.dat的二進制檔案中,
請在下劃線處填入正確的內容并將下劃線洗掉,使程式得出正確的結果,
注意:不得增行或刪行,也不得更改程式的結構!
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct
{
int num;
char name[10];
char tel[10];
}STYPE;
void check();
/**********found**********/
int fun(___1___ *std)
{
/**********found**********/
___2___ *fp;
int i;
if((fp=fopen("myfile5.dat","wb"))==NULL)
return (0);
printf("\nOutput data to file !\n");
for(i=0; i<N; i++)
/**********found**********/
fwrite(&std[i], sizeof(STYPE), 1, _3_);
fclose(fp);
return (1);
}
int main()
{
STYPE s[10]={{1,"aaa","1111"},{1,"bbb","2222"},
{1,"ccc","3333"}, {1,"ddd","4444"},
{1,"eee","5555"}};
int k;
k=fun(s);
if (k==1)
{ printf("Succeed!"); check(); }
else
printf("Fail!");
return 0;
}
void check()
{
FILE *fp;
int i;
STYPE s[10];
if((fp=fopen("myfile5.dat","rb"))==NULL)
{ printf("Fail !!\n"); exit(0); }
printf("\nRead file and output to screen :\n");
printf("\n num name tel\n");
for(i=0; i<N; i++)
{
fread(&s[i],sizeof(STYPE),1, fp);
printf("%6d %s %s\n",s[i].num,s[i].name,s[i].tel);
}
fclose(fp);
}
7.給定程式中,通過定義學生結構體變數,存盤了學生的學號、姓名和3門課的成績,所有學生資料均以二進制方式輸出到檔案中,函式fun的功能是:重寫形參filename所指檔案中最后一個學生的資料,即用新的學生資料覆寫該學生原來的資料,其他學生的資料不變,
請在下劃線處填入正確的內容并將下劃線洗掉,使程式得出正確的結果,
注意:不得增行或刪行,也不得更改程式的結構!
#include <stdio.h>
#define N 5
typedef struct student
{
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename, STU n)
{
FILE *fp;
/**********found**********/
fp = fopen(__1__, "rb+");
/**********found**********/
fseek(fp, -1L*sizeof(STU), __2__);
/**********found**********/
fwrite(__3__, sizeof(STU), 1, fp);
fclose(fp);
}
int main()
{
STU t[N]={ {10001,"MaChao", 91, 92, 77},
{10002,"CaoKai", 75, 60, 88},
{10003,"LiSi", 85, 70, 78},
{10004,"FangFang", 90, 82, 87},
{10005,"ZhangSan", 95, 80, 88}};
STU n={10006,"ZhaoSi", 55, 70, 68}, ss[N];
int i,j;
FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n\n");
for (j=0; j<N; j++)
{
printf("\nNo:%ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
fun("student.dat", n);
printf("\nThe data after modifing :\n\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
return 0;
}
8.給定程式中,通過定義學生結構體變數,存盤了學生的學號、姓名和3門課的成績,所有學生資料均以二進制方式輸出到檔案中,函式fun的功能是:從形參filename所指的檔案中讀入學生資料,并按照學號從小到大排序后,再用二進制方式把排序后的學生資料輸出到filename所指的檔案中,覆寫原來的檔案內容,
請在下劃線處填入正確的內容并將下劃線洗掉,使程式得出正確的結果,
注意:不得增行或刪行,也不得更改程式的結構!
#include <stdio.h>
#define N 5
typedef struct student
{
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename)
{
FILE *fp;
int i, j;
STU s[N], t;
/**********found**********/
fp = fopen(filename, __1__);
fread(s, sizeof(STU), N, fp);
fclose(fp);
for (i=0; i<N-1; i++)
for (j=i+1; j<N; j++)
/**********found**********/
if (s[i].sno __2__s[j].sno)
{ t=s[i]; s[i]=s[j]; s[j]=t; }
fp = fopen(filename, "wb");
/**********found**********/
__3__(s, sizeof(STU), N, fp);
fclose(fp);
}
int main()
{
STU t[N]={ {10005,"ZhangSan", 95, 80, 88},
{10003,"LiSi", 85, 70, 78},
{10002,"CaoKai", 75, 60, 88},
{10004,"FangFang", 90, 82, 87},
{10001,"MaChao", 91, 92, 77}}, ss[N];
int i,j;
FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), 5, fp);
fclose(fp);
printf("\n\nThe original data :\n\n");
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",t[j].sno, t[j].name);
for (i=0; i<3; i++)
printf("%6.2f ", t[j].score[i]);
printf("\n");
}
fun("student.dat");
printf("\n\nThe data after sorting :\n\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), 5, fp);
fclose(fp);
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++)
printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
return 0;
}
9.給定程式中,通過定義學生結構體變數,存盤了學生的學號、姓名和3門課的成績,所有學生資料均以二進制方式輸出到student.dat檔案中,函式fun的功能是:從指定檔案中找出指定學號的學生資料,讀入此學生資料,對該生的分數進行修改,使每門課的分數加3分,修改后重寫檔案中該學生的資料,即用該學生的新資料覆寫該學生原來的資料,其他學生的資料不變;若找不到,則什么都不做,
請在下劃線處填入正確的內容并將下劃線洗掉,使程式得出正確的結果,
注意:不得增行或刪行,也不得更改程式的結構!
#include <stdio.h>
#define N 5
typedef struct student
{
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename, long sno)
{
FILE *fp;
STU n;
int i;
fp = fopen(filename,"rb+");
/**********found**********/
while (!__1__)
{
fread(&n, sizeof(STU), 1, fp);
/**********found**********/
if (n.sno__2__) break;
}
if (!feof(fp))
{
for (i=0; i<3; i++) n.score[i] += 3;
/**********found**********/
fseek(fp, -1L*__3__, SEEK_CUR);
fwrite(&n, sizeof(STU), 1, fp);
}
fclose(fp);
}
int main()
{
STU t[N]={{10001,"MaChao", 91, 92, 77},
{10002,"CaoKai", 75, 60, 88},
{10003,"LiSi", 85, 70, 78},
{10004,"FangFang", 90, 82, 87},
{10005,"ZhangSan", 95, 80, 88}}, ss[N];
int i,j;
FILE *fp;
fp = fopen("student.dat", "wb");
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe original data :\n");
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++)
printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
fun("student.dat", 10003);
fp = fopen("student.dat", "rb");
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf("\nThe data after modifing :\n");
for (j=0; j<N; j++)
{
printf("\nNo: %ld Name: %-8s Scores: ",ss[j].sno, ss[j].name);
for (i=0; i<3; i++)
printf("%6.2f ", ss[j].score[i]);
printf("\n");
}
return 0;
}
1.(1)"r" (2)fs (3)ft 2.(1)FILE * (2)fclose(fp) (3)fp 3.(1)FILE * (2)fp (3)ch 4.(1)fp (2)fclose(fp) (3)fname 5.(1)*fw (2)str (3)str 6.(1)STYPE (2)FILE (3)fp 7.(1)filename (2)SEEK_END (3)&n 8.(1)"rb" (2)> (3)fwrite 9.(1)feof(fp) (2)==sno (3)sizeof(STU)程式填空題練習題參考答案
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/532631.html
標籤:C
上一篇:VSCode上的內核問題
下一篇:Java反應式編程(1)
