1. 程式人生 > 其它 >實驗5 結構體和檔案

實驗5 結構體和檔案

四、實驗結論 1. 實驗任務1 task1_1
 1 //將圖書資訊寫入文字檔案data1.txt
 2  
 3 #include <stdio.h>
 4 #define N 5
 5 #define M 80
 6 
 7 typedef struct
 8 {
 9     char name[M]; // 書名
10     char author[M]; // 作者
11 }Book;
12 
13 
14 int main()
15 {
16     Book x[N] = {     {"一九八四", "喬治.奧威爾"},
17                       {"美麗新世界", "赫胥黎"},
18                       {"
昨日的世界", "斯蒂芬.茨威格"}, 19 {"萬曆十五年", "黃仁宇"}, 20 {"一隻特立獨行的豬", "王小波"} 21 }; 22 int i; 23 24 FILE *fp; 25 26 // 以寫的方式開啟文字檔案data1.txt 27 fp = fopen("data1.txt", "w"); 28 29 // 如果開啟檔案失敗,輸出提示資訊並返回 30 if(fp == NULL)
31 { 32 printf("fail to open file\n"); 33 return 1; 34 } 35 36 // 將結構體陣列x中的圖書資訊寫到fp指向的檔案data1.txt 37 // 同時也輸出到螢幕上 38 for(i=0; i<N; ++i) 39 { 40 fprintf(fp, "%-20s %-20s\n", x[i].name, x[i].author); 41 printf("%-20s %-20s\n", x[i].name, x[i].author);
42 } 43 44 fclose(fp); 45 46 return 0; 47 }
task1_2
 1 //從文字檔案data1.txt中讀取圖書資訊,並列印輸出到螢幕 
 2 
 3 #include<stdio.h>
 4 #define N 5
 5 #define M 80
 6 
 7 typedef struct
 8 {
 9     char name[M]; // 書名
10     char author[M]; // 作者
11 }Book;
12 
13 
14 int main()
15 {
16     Book x[N];
17     int i;
18     
19     FILE *fp;
20     
21     // 以讀的方式開啟文字檔案data1.txt
22     fp = fopen("data1.txt", "r");
23     
24     // 如果開啟檔案失敗,輸出提示資訊並返回
25     if(fp == NULL)
26     {
27         printf("fail to open file\n");
28         return 1;
29     }
30     
31     // 從fp指向的檔案data1.txt中讀取資訊到結構體陣列x
32     // 同時,把x的內容輸出到螢幕上
33     for(i=0; i<N; ++i)
34     {
35         fscanf(fp, "%s %s\n", x[i].name, x[i].author);
36         printf("%-20s %-20s\n", x[i].name, x[i].author);
37     }
38     
39     fclose(fp);
40     
41     return 0;
42 }

問題:line35,從檔案中讀取圖書名、圖書作者時,為什麼x[i].name和x[i].author前面沒有地址符&?

回答:name和author是字元陣列,陣列不需要加取地址符獲取的也是該元素的地址。

2. 實驗任務2 task2_1
 1 //將圖書資訊以資料塊方式寫入二進位制檔案data2.dat
 2 
 3 #include <stdio.h>
 4 #define N 5
 5 #define M 80
 6 
 7 typedef struct
 8 {
 9     char name[M]; // 書名
10     char author[M]; // 作者
11 }Book;
12 
13 
14 int main()
15 {
16     Book x[N] = { {"一九八四", "喬治.奧威爾"},
17                   {"美麗新世界", "赫胥黎"},
18                   {"昨日的世界", "斯蒂芬.茨威格"},
19                   {"萬曆十五年", "黃仁宇"},
20                   {"一隻特立獨行的豬", "王小波"}
21                 };
22     int i;
23     
24     FILE *fp;
25     
26     // 以寫的方式開啟二進位制檔案data2.dat
27     fp = fopen("data2.dat", "wb");
28     
29     // 如果開啟檔案失敗,輸出提示資訊並返回
30     if(fp == NULL)
31     {
32         printf("fail to open file\n");
33         return 1;
34     }
35     
36     // 將結構體陣列x中的圖書資訊寫以資料塊方式寫入檔案
37     // 把從地址x處開始sizeof(Book)×N個位元組大小的資料塊寫入fp指向的檔案
38     fwrite(x, sizeof(Book), N, fp);
39     
40     
41     fclose(fp);
42     
43     return 0;
44 }
問題:1. 觀察、驗證在當前路徑下,是否生成一個檔名為data2.dat的資料檔案。    2. 嘗試用文字編輯器開啟,檢視其內容,是否直觀可見? 回答:1.生成了    2.用記事本開啟,內容可見,以一行一列的形式展現   task2_2
 1 //從二進位制檔案data2.dat中讀取圖書資訊,並列印輸出到螢幕
 2 
 3 #include <stdio.h>
 4 #define N 5
 5 #define M 80
 6 
 7 typedef struct
 8 {
 9     char name[M]; // 書名
10     char author[M]; // 作者
11 }Book;
12 
13 
14 int main()
15 {
16     Book x[N];
17     int i;
18     
19     FILE *fp;
20     
21     // 以讀的方式開啟二進位制檔案data2.dat
22     fp = fopen("data2.dat", "rb");
23     
24     // 如果開啟檔案失敗,輸出提示資訊並返回
25     if(fp == NULL)
26     {
27         printf("fail to open file\n");
28         return 1;
29     }
30     
31     // 從fp指向的檔案中讀取資料塊到x對應的地址單元
32     // 資料塊大小為sizeof(Book)×N
33     fread(x, sizeof(Book), N, fp);
34     
35     // 在螢幕上輸出結構體陣列x中儲存的資料
36     for(i=0; i<N; ++i)
37         printf("%-20s%-20s\n", x[i].name, x[i].author);
38         
39         
40     fclose(fp);
41     
42     return 0;
43 }
3. 實驗任務3
 1 //統計資料檔案data3_1.txt中字元數 
 2 
 3 #include <stdio.h>
 4 
 5 int main()
 6 {
 7     FILE *fin, *fout;
 8     char ch;
 9     int count=0;
10     
11     // 以只讀、文字方式開啟檔案data3_1.txt
12     fin = fopen("data3_1.txt", "r");
13     
14     // 如果開啟失敗,輸出提示資訊並返回
15     if(fin == NULL)
16     {
17         printf("fail to open data3_1.txt\n");
18         return 1;
19     }
20     
21     // 當fin指向的檔案data1_txt沒有結束時
22     while( !feof(fin) )
23     {
24         // 從fin指向的檔案data1_txt讀取單個字元
25         ch = fgetc(fin);
26         
27         // 如果ch不是空白符,個數加一 
28         if(ch != ' ' && ch!='\t'&&ch!='\n')
29             count+=1;
30     }
31     
32     fclose(fin);
33     printf("data3_1.txt中包含字元數:%d",count); 
34     
35     return 0;
36 }
5. 實驗任務5
  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 
  5 #define N 10
  6 
  7 typedef struct
  8 {
  9     long int id;
 10     char name[20];
 11     float objective; /*客觀題得分*/
 12     float subjective; /*操作題得分*/
 13     float sum;
 14     char level[10];
 15 } STU;
 16 
 17 // 函式宣告
 18 void input(STU s[], int n);
 19 void output(STU s[], int n);
 20 void process(STU s[], int n);
 21 
 22 int main()
 23 {
 24     STU stu[N];
 25     printf("從檔案讀入%d個考生資訊: 准考證號,姓名,客觀題得分(<=40),操作題得分(<=60)\n", N);
 26     input(stu, N);
 27     
 28     printf("\n對考生資訊進行處理: 計算總分,確定等級\n");
 29     process(stu, N);
 30     
 31     printf("\n列印考生完整資訊, 並儲存到檔案中");
 32     output(stu, N);
 33     
 34     return 0;
 35 }
 36 
 37 // 從文字檔案examinee.txt讀入考生資訊:准考證號,姓名,客觀題得分,操作題得分
 38 void input(STU s[], int n)
 39 {
 40     int i;
 41     FILE *fin;
 42     fin = fopen("examinee.txt", "r");
 43     if (fin == NULL)
 44     {
 45         printf("fail to open file\n");
 46         exit(0);
 47     }
 48     
 49     while (!feof(fin))
 50     {
 51         for (i = 0; i < n; i++)
 52             fscanf(fin, "%ld %s %f %f", &s[i].id, s[i].name,&s[i].objective, &s[i].subjective);
 53     }
 54     
 55     fclose(fin);
 56 }
 57 
 58 //輸出考生完整資訊: 准考證號,姓名,客觀題得分,操作題得分,總分,等級
 59 // 不僅輸出到螢幕上,還寫到文字檔案result.txt中
 60 void output(STU s[], int n)
 61 {
 62     FILE *fout;
 63     int i;
 64     
 65     // 輸出到螢幕
 66     printf("\n");
 67     printf("准考證號\t姓名\t客觀題得分\t操作題得分\t總分\t\t等級\n");
 68     for (i = 0; i < n; i++)
 69         printf("%ld\t\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%s\n", s[i].id,s[i].name, s[i].objective, s[i].subjective, s[i].sum, s[i].level);
 70     
 71     // 儲存到檔案
 72     fout = fopen("result.txt", "w");
 73     if (!fout)
 74     {
 75         printf("fail to open or create result.txt\n");
 76         exit(0);
 77     }
 78     
 79     fprintf(fout, "准考證號\t\t姓名\t客觀題得分\t操作題得分\t總分\t\t等級\n");
 80     
 81     for (i = 0; i < n; i++)
 82         fprintf(fout, "%ld\t\t%s\t%.2f\t\t%.2f\t\t%.2f\t\t%s\n", s[i].id,s[i].name, s[i].objective, s[i].subjective, s[i].sum, s[i].level);
 83         
 84     fclose(fout);
 85 }
 86 
 87 // 對考生資訊進行處理:計算總分,排序,確定等級
 88 void process(STU s[], int n)
 89 {
 90     int i = 0,j;
 91     float leva = n / 10,levb=n/2;
 92     STU c;
 93     for (i = 0; i < n; i++) {
 94         s[i].sum = s[i].objective + s[i].subjective;        
 95     }
 96     for (i=0;i<n;i++)
 97         for ( j = i; j < n; j++)
 98         {
 99             if (s[i].sum < s[j].sum) {
100                 c = s[i];
101                 s[i] = s[j];
102                 s[j] = c;
103             }
104         }    
105     for (i = 0; i < n; i++) {
106         if (i<leva)
107             strcpy(s[i].level, "優秀");
108         else if 
109             (i < levb)strcpy(s[i].level, "合格");
110         else 
111             strcpy(s[i].level, "不合格");
112     }
113 }
6. 實驗任務6
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <time.h>
 5 #define N 80
 6 typedef struct
 7 {
 8     long int id;
 9     char name[20];
10     char class[80];
11     int target;
12 } STU;
13 void input(STU s[], int n);
14 void srand_stu(STU s[], STU lucky[], int num);
15 void output(STU s[], int n);
16 int main()
17 {
18     STU stu[N];
19     STU lucky_stu[5];
20     //匯入資料到stu陣列
21     input(stu, N);
22     //選人
23     srand_stu(stu, lucky_stu, 5);
24     return 0;
25 }
26 void input(STU s[], int n)
27 {
28     int i;
29     FILE *fin;
30     fin = fopen("list.txt", "r");
31     if (fin == NULL)
32     {
33         printf("fail to open file\n");
34         exit(0);
35     }
36     while (!feof(fin))
37     {
38         for (i = 0; i < n; i++)
39             fscanf(fin, "%ld %s %s", &s[i].id, s[i].name,
40                    &s[i].class);
41     }
42     fclose(fin);
43 }
44 void srand_stu(STU s[], STU lucky[], int num)
45 {
46     int i;
47     time_t t;
48     srand((unsigned)time(&t));
49     int lucky_num;
50     for ( i = 0; i < num; i++)
51     {
52         lucky_num = rand() % 79 + 1;
53         if (s[lucky_num].target != 1)
54         {
55             lucky[i] = s[lucky_num];
56             s[lucky_num].target = 1;
57         }
58     }
59     for (i = 0; i < 5; i++)
60     {
61         printf("%ld  %s  %s\n", lucky[i].id, lucky[i].name, lucky[i].class);
62     }
63     FILE *fout;
64     fout = fopen("result.txt", "w");
65     for (i = 0; i < num; i++)
66         fprintf(fout, "%ld  %s  %s\n", lucky[i].id, lucky[i].name, lucky[i].class);
67     fclose(fout);
68 }