第11章 文件
1:????/*c語言數(shù)據(jù)文件有幾種存儲形式?每種存儲形式個有什么特點(diǎn)?*/
??????答:在C語言使用的文件系統(tǒng)中,數(shù)據(jù)文件的數(shù)據(jù)存儲形式有兩種:一種以字符形式存放,這種文件稱為字符文件
??????????,也稱為文本文件或者是正文文件;另外一種是以二進(jìn)制代碼形式存放,這種文件稱為二進(jìn)制文件。
??????????一般的說,二進(jìn)制文件節(jié)省存儲空間,并且在輸入時不需要把字符代碼先轉(zhuǎn)化成二進(jìn)制代碼形式再送入內(nèi)存,
??????????在輸出時也不需要把數(shù)據(jù)由二進(jìn)制代碼轉(zhuǎn)化成字符代碼再輸出,因而輸入輸出速度快。用戶程序在實(shí)用中,從
?????????節(jié)省時間和空間的要求考慮,一般選用二進(jìn)制文件。但是,如果用戶準(zhǔn)備的數(shù)據(jù)是作為文檔使用閱讀時,則一
??????????般使用字符文件,他們可以方便,快捷的通過顯示器或打印機(jī)直接輸出。
2:?/*打開文件,關(guān)閉文件的含義是什么?為什么要打開關(guān)閉文件?*/
????答:?打開文件的含義:要把文件使用方式寫入FILE結(jié)構(gòu)體變量中;返回一個FILE結(jié)構(gòu)體指針,指向該文件的FILE結(jié)構(gòu)
?????????體變量,通過該文件指針可以對文件進(jìn)行操作。
?????????關(guān)閉文件的含義:文件指針不再指向原來指向的文件。
?????????為什么要打開文件:(1)要確定文件的使用方式;(2)要得到一個指向文件的指針;(3)還需檢測文件是否存在,
?????????磁盤是否出故障等。
?????????為什么要關(guān)閉文件:(1)防止文件被誤用;(2)具體系統(tǒng)中同時打開的文件的數(shù)目是有限的。
?
3:?/*C語言標(biāo)準(zhǔn)的I/O接口操作提供了幾種文件存取方式?每種方式各有什么特點(diǎn)?*/
????答:?標(biāo)準(zhǔn)I/O提供了4種文件存取方法:
?????????(1):讀寫一個字符。
?????????(2):讀寫一個字符串,將多個字符組成的字符串寫入文件或從文件中讀出。
?????????(3):格式化讀寫,根據(jù)格式控制指定的數(shù)據(jù)格式對數(shù)據(jù)進(jìn)行轉(zhuǎn)換存取。
?????????(4):成塊讀寫,也稱做按記錄讀寫。C語言的文件雖然是按字節(jié)流存放,但可以按記錄存取多個字節(jié)的數(shù)據(jù)。
?
4:/*什么是文件型指針?通過文件指針訪問文件有什么好處?*/
???答:?系統(tǒng)定義FILE結(jié)構(gòu)體類型,建立文件相當(dāng)于定義了一個FILE結(jié)構(gòu)體變量,該結(jié)構(gòu)體變量存放文件的有關(guān)信息。打開
????????文件返回一個FILE結(jié)構(gòu)體指針,指向該文件的FILE結(jié)構(gòu)體變量。所以,文件型指針就是指向文件的FILE結(jié)構(gòu)體變量的
????????指針。
????????通過文件指針訪問文件,也即用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];/*各個同學(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);
}
第12章 C語言綜合應(yīng)用程序示例
暫無