C语言FILE指针的使用方法

C语言FILE指针的使用方法

文章目录

  • C语言FILE指针的使用方法
  • 一、FILE指针
    • 1.定义
    • 2.文件类型分类
    • 3.文件打开方式
    • 4.文件打开
    • 5.文件关闭
  • 二、文件读写函数
    • 1.单字节的输入输出函数
    • 2.文件指针移动函数
    • 3.正文文件读/写函数
  • 三、编程实现万年历
    • 1.要求:

一、FILE指针

1.定义

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:打开方式(读写方式,文件类型)

C语言FILE指针的使用方法_第1张图片

2.文件类型分类

  1. 文本文件:这类文件以文本的ASCII、UNICODE(万国码)等编码形式存储在计算机中。它是以"行"为基本结构的一种信息组织和存储方式。
  2. 二进制文件:这类文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们,只有通过相应的软件才能将其显示出来。二进制文件一般是可执行程序、图形、图像、声音等等。

3.文件打开方式

  1. "r"正文文件只读方式打开。文件不存在,则打开失败
  2. "w"正文文件只写方式打开。若文件不存在,则建立文件;若文件存在,则删除文件内容,重建空文件
  3. "a"正文文件添加方式。文件不存在,则建立文件
  4. "r+ ":正文文件读写打开,文件不存在,则打开失败
  5. "w+ " :正文文件读写方式打开,文件不存在,则建立文件

4.文件打开

#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"); 

5.文件关闭

fclose(FILE *fp)
一般地,fclose(fp)应与fopen配对使用,特别是含有写方式的文件,若不关闭,可能会造成文件数据丢失。

二、文件读写函数

1.单字节的输入输出函数

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);
}

2.文件指针移动函数

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);
}

3.正文文件读/写函数

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);
}

三、编程实现万年历

1.要求:

输入年份,输出该年的日历,结果保存在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 这样的年份才能算闰年。
C语言FILE指针的使用方法_第2张图片

#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++;
    }

}

你可能感兴趣的:(C语言,FILE指针)