1: / *c語(yǔ)言數(shù)據(jù)文件有幾種存儲(chǔ)形式?每種存儲(chǔ)形式個(gè)有什么特點(diǎn)?*/
答:在C語(yǔ)言使用的文件系統(tǒng)中,數(shù)據(jù)文件的數(shù)據(jù)存儲(chǔ)形式有兩種:一種以字符形式存放,這種文件稱為字符文件
,也稱為文本文件或者是正文文件;另外一種是以二進(jìn)制代碼形式存放,這種文件稱為二進(jìn)制文件。
一般的說(shuō),二進(jìn)制文件節(jié)省存儲(chǔ)空間,并且在輸入時(shí)不需要把字符代碼先轉(zhuǎn)化成二進(jìn)制代碼形式再送入內(nèi)存,
在輸出時(shí)也不需要把數(shù)據(jù)由二進(jìn)制代碼轉(zhuǎn)化成字符代碼再輸出,因而輸入輸出速度快。用戶程序在實(shí)用中,從
節(jié)省時(shí)間和空間的要求考慮,一般選用二進(jìn)制文件。但是,如果用戶準(zhǔn)備的數(shù)據(jù)是作為文檔使用閱讀時(shí),則一
般使用字符文件,他們可以方便,快捷的通過(guò)顯示器或打印機(jī)直接輸出。
2: / *打開文件,關(guān)閉文件的含義是什么?為什么要打開關(guān)閉文件?*/
答: 打開文件的含義:要把文件使用方式寫入FILE結(jié)構(gòu)體變量中;返回一個(gè)FILE結(jié)構(gòu)體指針,指向該文件的FILE結(jié)構(gòu)
體變量,通過(guò)該文件指針可以對(duì)文件進(jìn)行操作。
關(guān)閉文件的含義:文件指針不再指向原來(lái)指向的文件。
為什么要打開文件:(1)要確定文件的使用方式;(2)要得到一個(gè)指向文件的指針;(3)還需檢測(cè)文件是否存在,
磁盤是否出故障等。
為什么要關(guān)閉文件:(1)防止文件被誤用;(2)具體系統(tǒng)中同時(shí)打開的文件的數(shù)目是有限的。
3: / *C語(yǔ)言標(biāo)準(zhǔn)的I/O接口操作提供了幾種文件存取方式?每種方式各有什么特點(diǎn)?*/
答: 標(biāo)準(zhǔn)I/O提供了4種文件存取方法:
(1):讀寫一個(gè)字符。
(2):讀寫一個(gè)字符串,將多個(gè)字符組成的字符串寫入文件或從文件中讀出。
(3):格式化讀寫,根據(jù)格式控制指定的數(shù)據(jù)格式對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換存取。
(4):成塊讀寫,也稱做按記錄讀寫。C語(yǔ)言的文件雖然是按字節(jié)流存放,但可以按記錄存取多個(gè)字節(jié)的數(shù)據(jù)。
4:/ *什么是文件型指針?通過(guò)文件指針訪問文件有什么好處?*/
答: 系統(tǒng)定義FILE結(jié)構(gòu)體類型,建立文件相當(dāng)于定義了一個(gè)FILE結(jié)構(gòu)體變量,該結(jié)構(gòu)體變量存放文件的有關(guān)信息。打開
文件返回一個(gè)FILE結(jié)構(gòu)體指針,指向該文件的FILE結(jié)構(gòu)體變量。所以,文件型指針就是指向文件的FILE結(jié)構(gòu)體變量的
指針。
通過(guò)文件指針訪問文件,也即用FILE結(jié)構(gòu)體變量成員,比較方便。
5: (1) [1]: fopen(fname,"w")
[2]: ch
[3]: fclose(fp)
(2) [1]: "r+"
[2]: str[i]-32
[3]: "r"
6、
#include<stdio.h>
main()
{ FILE *p;
char ch;
if((p=fopen(file.c,"w"))==NULL)
{ printf("cannot open file.\n");
exit(1);
}
ch=getch();
while(ch!='#')
{ if(ch>=65&&ch<=90)ch+=32;fputc(ch,p);putchar(ch);ch=getchar();}
fclose(p);
}
7、
#include<stdio.h>
void main()
{ FILE *fp;
int i,j,n,k;
char x[160],ch,t;
if((fp=fopen("file1","r"))==NULL)
{ printf("Can't open file1\n");
exit(1);
}
for(i=0;(ch=fgetc(fp))!=EOF;i++)
{ x[i]=ch;
}
fclose(fp);
if((fp=fopen("file2","r"))==NULL)
{ printf("Can't open file2\n");
exit(1);
}
while((ch=fgetc(fp)!=EOF))
{ x[i]=ch;
i++;
}
n=i;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(x[i]>x[j]) k=j;
if(k!=i)
{ t=x[i];x[i]=x[j];x[j]=t;}
}
if((fp=fopen("file3","w"))==NULL)
{ printf("Can't open file3\n");
exit(1);
}
for(i=0;i<n;i++)
fputc(x[i],fp);
fclose(fp);
}
8、
9、
#include<stdio.h>
main()
{ FILE *fp;
char str;
if((fp=fopen("text.txt","w"))==NULL)
{ printf("Can't open this file.\n");
exit(1);
}
printf("\nInput char: ");
while((str=fgetc(stdin))!='#')
fputc(str,fp);
fclose(fp);
fp=fopen("text.txt","r");
while((str=fgetc(fp))!=EOF)
{ if(str>=97&&str<=122)
str-=32;
fputc(str,stdout);
}
fclose(fp);
}
10、
#include<stdio.h>
struct student
{ char sid[15];
char name[15];
int score[3];
float ave;
}stu[100];
void main()
{ int i,j,n,sum=0,all[3]={0};
FILE *fp;
printf("How many student you want to input?: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{ printf("Input the message of %d student\n",i+1);
printf("\tsid:\t");scanf("%s",stu[i].sid);
printf("\tname:\t");scanf("%s",stu[i].name);
sum=0;
for(j=0;j<3;j++)
{ printf("%d score:\t",j+1);
scanf("%d",&stu[i].score[j]);
sum=sum+stu[i].score[j];/ *各個(gè)同學(xué)的總分*/
all[j]+=stu[i].score[j];/ *該班各門課程的總分*/
}
stu[i].ave=sum/3.0;
}
if((fp=fopen("stud1","wb"))==NULL)/ *文件以二進(jìn)制形式打開*/
{ printf("Can't open stud file\n");
exit(1);
}
for(i=0;i<n;i++)
{ if(fwrite(&stu[i],sizeof(struct student),1,fp)!=1)/ *該班各門課程總分還沒有輸入文件*/
printf("file write error.\n");
fclose(fp);
}
}
11、
#include<stdio.h>
struct student
{ char sid[15];
char name[15];
int score[3];
float ave;
}stu1[100],change;
main()
{ FILE *fp;
int i,j,n,k;
if((fp=fopen("stud1","rb"))==NULL)
{ printf("Can't open file\n");
exit(1);
}
for(i=0;fread(&stu1[i],sizeof(struct student),1,fp)!=1;i++)
fclose(fp);
n=i;
for(i=0;i<n-1;i++)
{ k=i;
for(j=i+1;j<n;j++)
if(stu1[i].ave<stu1[j].ave)k=j;
if(k!=i)
{ change=stu1[i];stu1[i]=stu1[j];stu1[j]=change;}
}
fp=fopen("stu2","wb");
for(i=0;i<n;i++)
fwrite(&stu1[i],sizeof(struct student),1,fp);
fclose(fp);
}