物聯網技術部第三次軟體培訓總結
物聯網技術部第三次軟體培訓總結
文章目錄
一、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.檔案型別分類
- 文字檔案:這類檔案以文字的ASCII、UNICODE(萬國碼)等編碼形式儲存在計算機中。它是以"行"為基本結構的一種資訊組織和儲存方式。
- 二進位制檔案:這類檔案以文字的二進位制形式儲存在計算機中,使用者一般不能直接讀懂它們,只有通過相應的軟體才能將其顯示出來。二進位制檔案一般是可執行程式、圖形、影象、聲音等等。
3.檔案開啟方式
- "r"正文檔案只讀方式開啟。檔案不存在,則開啟失敗
- "w"正文檔案只寫方式開啟。若檔案不存在,則建立檔案;若檔案存在,則刪除檔案內容,重建空檔案
- "a"正文檔案新增方式。檔案不存在,則建立檔案
- "r+ ":正文檔案讀寫開啟,檔案不存在,則開啟失敗
- "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++;
}
}