101.共用體類型存儲方式
#include <stdio.h>
union Data
{
int i;
char ch;
float f; //i,ch,f共用同一存儲單元
} a; //一瞬間只能放其中一個變量成員
int main()
{
a.i=97;
printf("%d\n",a.i); //輸出int
printf("%c\n",a.ch); //輸出對應ASCII碼的字符
printf("%f\n",a.f); //float輸出int的低兩個字節
return 0;
}
運行結果:
102.共用體教師和學生示例
#include <stdio.h>
struct Person
{
int num;
char name[20];
char sex;
char job;
union //共用體
{
int clas;
char position[10];
} category;
} person[2];
int main()
{
int i;
printf("輸入教師或學生的信息:\n");
for(i=0; i<2; i++)
{
scanf("%d %s %c %c",&person[i].num,person[i].name,&person[i].sex,&person[i].job);
if(person[i].job=='s') //若job爲學生,則輸入班級
scanf("%d",&person[i].category.clas);
else if(person[i].job=='t') //若job爲教師,則輸入職位
scanf("%s",person[i].category.position);
else
printf("Input error!\n");
}
printf("打印教室或學生的成績:\n");
for(i=0; i<2; i++)
{
printf("%d %s %c %c ",person[i].num,person[i].name,person[i].sex,person[i].job);
if(person[i].job=='s')
printf("%d",person[i].category.clas);
else if(person[i].job=='t')
printf("%s",person[i].category.position);
printf("\n");
}
return 0;
}
運行結果:
103.枚舉類型
#include <stdio.h>
int main()
{
enum Weekday {sun,mon,tue,wed,thu,fri,sat} workday,weekend;
workday=mon;
weekend=sun;//可以直接進行賦值
printf("mon=%d\ntue=%d\nwed=%d\nthu=%d\nfri=%d\nsat=%d\nsun=%d\n",mon,tue,wed,thu,fri,sat,sun);
printf("for語句打印enum:\n");
for(int i=sun; i<=sat; i++) //用for進行循環enum
printf("%d\n",i);
if(workday==mon)
printf("workday,I want to play with you!\n");
if(weekend==sun)
printf("Weekend,I want to work very hard!\n");
printf("另一種賦初值方法:\n");
enum week {Mon = 1, Tues, Wed, Thurs, Fri = 10, Sat, Sun}; //進行賦值之後的值
printf("Mon=%d\nTues=%d\nWed=%d\nThurs=%d\nFri=%d\nSat=%d\nSun=%d\n", Mon, Tues, Wed, Thurs, Fri, Sat, Sun);
return 0;
}
運行結果:
總結:
1、在沒有顯示說明的情況下,枚舉常量(也就是花括號中的常量名)默認第一個枚舉常量的值爲0,往後每個枚舉常量依次遞增
2、在部分顯示說明的情況下,未指定的枚舉名的值將依着之前最有一個指定值向後依次遞增
3、一個整數不能直接賦值
給一個枚舉變量,必須用該枚舉變量所屬的枚舉類型進行類型強制轉換後才能賦值
4、同一枚舉類型中不同的枚舉成員可以具有相同的值
5、同一個程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的枚舉成員(枚舉常量)
104.用getchar函數從鍵盤逐個輸入字符,然後用fputc函數寫到磁盤文件即可。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char ch,filename[10];
printf("請輸入所用的文件名:");
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL) //以只寫的方式打開文件,若沒有文件則新建一個
{
printf("無法打開此文件\n");
exit(0);
}
ch=getchar(); //用來接收最後輸入的回車符
printf("輸入一個字符串(以#結束):");
ch=getchar(); //輸入一個字符
while(ch!='#')
{
fputc(ch,fp); //輸入文件中
putchar(ch); //屏幕上打印
ch=getchar(); //繼續接受下一個字符
}
fclose(fp); //關閉文件
putchar('\n');
return 0;
}
運行結果:
105.將一個磁盤文件的信息複製到另一個磁盤文件中。例如:file1.dat->file2.dat
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *in,*out;
char ch,infile[10],outfile[10];
printf("輸入讀入文件的名字:");
scanf("%s",infile);
printf("輸入讀出文件的名字:");
scanf("%s",outfile);
if((in=fopen(infile,"r"))==NULL) //"r"打開方式,找不到就報錯
{
printf("無法打開此文件\n");
exit(0);
}
if((out=fopen(outfile,"w"))==NULL) //"w"打開方式,找不到就新建
{
printf("無法打開此文件\n");
exit(0);
}
while(!feof(in)) //未遇到輸入文件的結束標誌
{
ch=fgetc(in); //從輸入文件中讀一個字符
fputc(ch,out); //將ch寫入到輸出文件中
putchar(ch); //將ch顯示在屏幕上
}
putchar('\n');
fclose(in);
fclose(out);
return 0;
}
運行結果:
106.從鍵盤讀入若干個字符串,對它們按字母大小的順序排序,然後把排好序的字符串送到磁盤文件中保存。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char str[3][10],temp[10];
int i,j,k,n=3;
printf("Enter strings:\n");
for(i=0; i<n; i++) //輸入n個字符串
gets(str[i]);
for(i=0; i<n-1; i++) //對輸入的n個字符串,由小到大,選擇排序
{
k=i;
for(j=i+1; j<n; j++)
if(strcmp(str[k],str[j])>0)
k=j;
if(k!=i)
{
strcpy(temp,str[i]);
strcpy(str[i],str[k]);
strcpy(str[k],temp);
}
}
if((fp=fopen("file1.dat","w"))==NULL) //打開文件
{
printf("can't open file!\n");
exit(0);
}
printf("\nThe new sequence:\n");
for(i=0; i<n; i++)
{
fputs(str[i],fp); //將字符串輸入到文件中
fputs("\n",fp); //將換行輸入到文件
printf("%s\n",str[i]); //在屏幕上顯示結果
}
return 0;
}
運行結果:
107.從文件中讀回字符串,並在屏幕上顯示。
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char str[3][10];
int i=0;
if((fp=fopen("file1.dat","r"))==NULL) //打開文件
{
printf("can't open file!\n");
exit(0);
}
while(fgets(str[i],10,fp)!=NULL) //fgets(str,n,fp)從fp所指向的文件讀入一個長度爲(n-1)的字符串
{
printf("%s",str[i]); //因爲讀入字符串數組中的每個字符串後都有"\n"
i++; //因此,printf()中不必加"\n"
}
fclose(fp);
return 0;
}
運行結果:
108. 用格式化的方式讀寫文件
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a,c;
float b,d;
FILE *fp;
if((fp=fopen("file1.dat","w"))==NULL) //必須以"w"打開文件
{
printf("can't open file!\n");
exit(0);
}
printf("請輸入整型a和浮點型b:\n");
scanf("%d %f",&a,&b);
fprintf(fp,"%d,%5.2f\n",a,b); //格式化輸入到文件中
fclose(fp);
if((fp=fopen("file1.dat","r"))==NULL) //必須以"r"打開文件,否則會出錯
{
printf("can't open file!\n");
exit(0);
}
printf("\n讀取文件中的數據:\n");
fscanf(fp,"%d,%f",&c,&d); //從文件中讀出數據
printf("%d,%5.2f\n",c,d); //打印在屏幕上
fclose(fp);
return 0;
}
運行結果:
109. 用二進制方式讀寫一組數據
#include <stdio.h>
#include <stdlib.h>
#define SIZE 4
struct Student_type //學生結構體
{
char name[10];
int num;
int age;
char addr[15];
} stud[SIZE];
void save() //將數據保存到文件中
{
FILE *fp;
int i;
if((fp=fopen("std.dat","wb"))==NULL)
{
printf("can't open file!\n");
return;
}
for(i=0; i<SIZE; i++)
if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1) //二進制形式輸出到文件中
printf("file write error!\n");
fclose(fp);
}
void print() //將數據讀出
{
struct Student_type st[SIZE];
FILE *fp;
int i;
if((fp=fopen("std.dat","rb"))==NULL)
{
printf("can't open file!\n");
return;
}
for(i=0; i<SIZE; i++)
{
if(fread(&st[i],sizeof(struct Student_type),1,fp)!=1) //二進制形式讀取文件數據
printf("file write error!\n");
printf("%s %d %d %s\n",st[i].name,st[i].num,st[i].age,st[i].addr); //將數據打印在屏幕上
}
fclose(fp);
}
void print2()
{
struct Student_type stu[SIZE];
FILE *fp;
int i;
if((fp=fopen("std.dat","rb"))==NULL)
{
printf("can't open file!\n");
return;
}
for(i=0; i<SIZE; i+=2)
{
fseek(fp,i*sizeof(struct Student_type),0); //隨機讀,用fseek指定位置,0表示距文件開始位置,1表示距文件當前位置,2表示距文件末尾位置
if(fread(&stu[i],sizeof(struct Student_type),1,fp)!=1) //二進制形式讀取文件數據
printf("file write error!\n");
printf("%s %d %d %s\n",stu[i].name,stu[i].num,stu[i].age,stu[i].addr); //將數據打印在屏幕上
}
fclose(fp);
}
int main()
{
int i;
printf("Please enter data of students:\n");
for(i=0; i<SIZE; i++) //輸入學生數據
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
save(); //存入文件中
printf("讀出文件內容:\n");
print(); //讀取文件數據
printf("隨機讀取文件內容:\n");
print2();
return 0;
}
運行結果:
110.隨機讀寫數據文件rewind
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp1,*fp2;
if((fp1=fopen("file1.dat","r"))==NULL) //打開輸入文件
{
printf("can't open file!\n");
exit(0);
}
if((fp2=fopen("file2.dat","w"))==NULL) //打開輸出文件
{
printf("can't open file!\n");
exit(0);
}
while(!feof(fp1))
putchar(fgetc(fp1)); //從文件中逐個讀入字符,然後輸出到屏幕
putchar('\n');
rewind(fp1); //此時文件指針已指向末尾,使其重新回到文件頭
while(!feof(fp1))
fputc(fgetc(fp1),fp2); //從文件頭重新讀字符,並輸入到文件file2中
fclose(fp1);
fclose(fp2);
return 0;
}
運行結果: