1.FILE类型是系统预先设定的一种结构体指针struct _iobuf
2.FILE* 指针作为文件句柄,是文件访问的唯一标识,它由fopen函数创建,fopen打开文件成功,则返回一个有效的FILE*指针,否则返回空指针NULL //[nʌl]
3.定义方式
FILE *fp=fopen(char *filename,char *mode);
或
FILE *fp;
fp=fopen(char *filename,char *mode);
FILE * fopen(char* filename,char* mode)
filename:文件名,如“students.txt”。
mode:打开方式(读写方式,文件类型)
#include
int main()
{
FILE *fp; /*文件指针*/
fp=fopen("member.txt","rb");
if(fp==NULL)
printf("提示:文件未能成功打开");
else
printf("提示:文件已经打开");
return 0;
}
Warning!
使用fopen时,但凡含r字母的打开方式,一定要加判断,文件是否打开成功,否则程序不会报告错误,会运行下去。
如:
FILE *fr;
fr=fopen("abc.txt","r");
if(fr==NULL){
printf("File not open!/n");
fclose(FILE *fp)
一般地,fclose(fp)应与fopen配对使用,特别是含有写方式的文件,若不关闭,可能会造成文件数据丢失。
int fgetc(FILE *fp) //读取当前位置的字符
#include
int main()
{
FILE *fp;
int c;
fp=fopen("member.txt","r");
while((c=fgetc(fp))!=EOF)
printf("%c",c);
fclose(fp);
}/*(多次输入fgetc(fp); 来改变文件操作位置指示器)注意:fgetc的返回值都是int型正数(0~255)
如果是文件里是英文小写,则返回值为其对应的Ascii码
文件无可读字节则返回-1(EOF)*/
int fputc(char ch.FILE *fp)
#include
int main()
{
char ch;
FILE *fp;
fp=fopen("member.txt","r");
ch=getchar();
fputc(ch,fp);
fclose(fp);
}
int rewind(FILE *fp)
#include
int main()
{
FILE *fp;
int c;
fp=fopen("member.txt","r");
fgetc(fp);
fgetc(fp);
rewind(fp);
printf("%c",fgetc(fp));
fclose(fp);
}
//文件指针重置为0
int feof(FILE *fp)
feof是C语言标准库函数,其原型在stdio.h中,其功能是检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0(即,文件结束:返回非0值,文件未结束,返回0
#include
int main()
{
FILE *fp;
int c;
int len;
fp=fopen("member.txt","r");
while(!feof(fp))
{ printf("%c",fgetc(fp));
}
//printf("%d",feof(fp));
fclose(fp);
}
int fscanf(FILEstream,constcharformat,[argument…]);
//读出文件 文件指针 格式字符串 输入列表
#include
int main()
{
FILE *fp;
char a[50];
long int b;
char c;
fp=fopen("member.txt","r");
fscanf(fp,"%s",a);
//fscanf(fp,"%ld",&b);
//fscanf(fp,"%c",&c);
printf("%s\n",a);
//printf("%ld\n",b);
//printf("%c\n",c);
fclose(fp);
}
//注意:fscanf遇到空格和换行时结束;
int fprintf (FILE* stream, const char*format, [argument])
//写进文件
#include
int main()
{
FILE *fp;
char a[50]= "this is a string";
int b=1;
char c='\n';
fp=fopen("member.txt","w");
fprintf(fp,"%s",a);
fprintf(fp,"%c",c);
fprintf(fp,"%d",b);
fclose(fp);
}
输入年份,输出该年的日历,结果保存在txt文件中。
由于一年并不是整整 365 天,而是 365 又四分之一天,因此按照每年 365 天来算,每过四年就会少一天,闰年便应需而生。但其实,每年也并非刚好 365 又四分之一天,精度高一点应该是365.242199 天——当然,你还可以进一步提高精度。也就是说,每四年其实有 365.242199 × 4 ≈ 1460.97 天,增加闰日会“矫枉过正”,让历法里多出 0.03 天来。这 0.03 天看上去关系不大,但每过 400 年就会多出整整 3 天,不得不需要 再修正一下。因此,我们的历法里还加了一条特殊的规定:如果年份的末两位是 00,则必须看它的前两位能不能被 4 整除。这样一来, 1700、1800、1900 都不能算作是闰年了,只有 1600、2000 这样的年份才能算闰年。
#include
int year_judge(int year);//返回值为 1代表闰年 0代表平年
int month_day(int month,int year);//返回值为当月有多少天
int day1_judge(int year);//返回值为当年1月1日为星期几
int day_judge(int month,int year);//返回值为当月1日为星期几
void printday(int month,int daycount,int t,FILE *fpt);//输出当月日历
int main()
{ int year,month,day,t,daycount;
FILE *fpt;
fpt = fopen("wannianli.txt","a");//打开文档,写入
printf("请输入年份(0-9999且输入-1为结束):");
while (scanf("%d",&year)!=EOF)
{ if(year==-1) break;
fprintf(fpt,"\n\n -------- %d年 -------- \n\n",year);//9个空格 8个- 中间还有空格
printf("\n\n -------- %d年 -------- \n\n",year);//9个空格 8个- 中间还有空格
for(month=1;month<=12;month++)
{ printf("\n\n************-------- %d月 --------************\n\n",month);//12个* 8个- 中间还有空格
printf(" SUN MON TUE WED THU FRI SAT \n");//3个空格
fprintf(fpt,"\n\n************-------- %d月 --------************\n\n",month);//12个* 8个- 中间还有空格
fprintf(fpt," SUN MON TUE WED THU FRI SAT \n");//3个空格
t=day_judge(month,year);
daycount=month_day(month,year);
printday(month,daycount,t,fpt);
}
printf("\n\n请输入年份(输入-1为结束):");
}
fclose(fpt);
return 0;
}
int year_judge(int year)
{ int t;
if(year%4==0&&year%100!=0) t = 1;
else t = 0;
if(year%400==0) t = 1;
return t;
}
int month_day(int month,int year)
{ int t,i=year_judge(year);
switch(month){
case 1: t = 31 ; break;
case 2: t = 28+i ; break;
case 3: t = 31 ; break;
case 4: t = 30 ; break;
case 5: t = 31 ; break;
case 6: t = 30 ; break;
case 7: t = 31 ; break;
case 8: t = 31 ; break;
case 9: t = 30 ; break;
case 10: t = 31 ; break;
case 11: t = 30 ; break;
case 12: t = 31 ; break;
}
return t;
}
int day1_judge(int year)// 0年1月1日为周六
{ int i=0,t=0,sum=0;
t = year ;
t %= 400;
if(t==0) return 6;
else{
i = (t-1)/4 - (t-1)/100+1;//判断 经过了多少个闰年
sum = (t-i) + i*2;
if (sum%7==0) sum=6;
else sum = sum%7+6;
if (sum>7) sum -= 7;
return sum;
}
}
int day_judge(int month,int year)
{ int i,t;
i=day1_judge(year);//1月1日为星期几
t=year_judge(year);
switch(month)
{ case 1: return i; break;
case 2: i=(i+3); if(i%7==0) i=7;
else i%=7; return i; break;
case 3: i=(i+t+3); if(i%7==0) i=7;
else i%=7; return i; break;
case 4: i=(i+t+6); if(i%7==0) i=7;
else i%=7; return i; break;
case 5: i=(i+t+1); if(i%7==0) i=7;
else i%=7; return i; break;
case 6: i=(i+t+4); if(i%7==0) i=7;
else i%=7; return i; break;
case 7: i=(i+t+6); if(i%7==0) i=7;
else i%=7; return i; break;
case 8: i=(i+t+2); if(i%7==0) i=7;
else i%=7; return i; break;
case 9: i=(i+t+5); if(i%7==0) i=7;
else i%=7; return i; break;
case 10:i=(i+t); if(i%7==0) i=7;
else i%=7; return i; break;
case 11:i=(i+3+t); if(i%7==0) i=7;
else i%=7; return i; break;
case 12:i=(i+5+t); if(i%7==0) i=7;
else i%=7; return i; break;
}
}
void printday(int month,int daycount,int t,FILE *fpt)
{ int x=1,i=2;
daycount--;
if(t==7) {
printf(" 1");//5个空格
fprintf(fpt," 1");
}
else
{ printf(" ");//6个空格
fprintf(fpt," ");
for(t;t>1;t--) {
printf(" ");//6个空格
fprintf(fpt," ");
x++;
}
x++;
printf(" 1");//5个空格
fprintf(fpt," 1");
}
for(daycount;daycount>0;daycount--)
{ if(x%7==0) {
fprintf(fpt,"\n");
printf("\n");
}
if(i<10) {
printf(" %d",i);//5个空格
fprintf(fpt," %d",i);
}
else {
printf(" %d",i);//4个空格
fprintf(fpt," %d",i);
}
i++;
x++;
}
}