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:開啟方式(讀寫方式,檔案型別)

在這裡插入圖片描述

2.檔案型別分類

  1. 文字檔案:這類檔案以文字的ASCII、UNICODE(萬國碼)等編碼形式儲存在計算機中。它是以"行"為基本結構的一種資訊組織和儲存方式。
  2. 二進位制檔案:這類檔案以文字的二進位制形式儲存在計算機中,使用者一般不能直接讀懂它們,只有通過相應的軟體才能將其顯示出來。二進位制檔案一般是可執行程式、圖形、影象、聲音等等。

3.檔案開啟方式

  1. "r"正文檔案只讀方式開啟。檔案不存在,則開啟失敗
  2. "w"正文檔案只寫方式開啟。若檔案不存在,則建立檔案;若檔案存在,則刪除檔案內容,重建空檔案
  3. "a"正文檔案新增方式。檔案不存在,則建立檔案
  4. "r+ ":正文檔案讀寫開啟,檔案不存在,則開啟失敗
  5. "w+ " :正文檔案讀寫方式開啟,檔案不存在,則建立檔案

4.檔案開啟

#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
int main()
{   
    char ch;
    FILE *fp;
    fp=fopen("member.txt","r");
    ch=getchar();
    fputc(ch,fp);
    fclose(fp);
}

2.檔案指標移動函式

int rewind(FILE *fp)

#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 這樣的年份才能算閏年。
在這裡插入圖片描述

#include <stdio.h>

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

}