ArrayList 概述 ArrayList 是一種變長的集合類,底層是基於數組來實現的,所以 ArrayList 查詢效率高、增刪效率低 ArrayList 集合中的元素是有序、可重覆的,且可以存儲 null 空值 當每次向 ArrayList 容器中添加元素時,會進行容量檢查:當往 ArrayL ...
一.基礎知識
在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)程式填空題練習題參考答案