实验6 文件应用编程

1. 实验任务1
/*
// 将图书信息写入文本文件data1.txt
#include <stdio.h>
#define N 7
#define M 80
typedef struct {
    char name[M];   // 书名 
    char author[M]; // 作者 
} Book;
int main() {
    Book x[N] = { {"《雕塑家》", "斯科特.麦克劳德"},
                  {"《灯塔》", "克里斯多夫.夏布特"},
                  {"《五号屠宰场》", "库尔特.冯内古特"},
                  {"《出卖月亮的人》", "罗伯特.海因莱茵"},
                  {"《大地之上》", "罗欣顿·米斯特里"},                     //结构体类型的初始化支持此操作
                  {"《上学记》", "何兆武"},
                  {"《命运》", "蔡崇达"} };
    int i;

    FILE* fp; //定义文件指针

    // 以写的方式打开文本文件data1.txt 
    fp = fopen("data1.txt", "w");         //fopen()函数:若顺利打开指定的文件则该函数返回该文件的首地址,否则返回NULL;

    // 如果打开文件失败,输出提示信息并返回 
    if (fp == NULL) {
        printf("fail to open file\n");
        return 1;
    }

    // 将结构体数组x中的图书信息写到fp指向的文件data1.txt
    // 同时也输出到屏幕上 
    for (i = 0; i < N; ++i) {
        fprintf(fp, "%-20s %-20s\n", x[i].name, x[i].author);
        printf("%-20s %-20s\n", x[i].name, x[i].author);
    }

    fclose(fp);

    return 0;
}
*/

/*
// 从文本文件data1.txt中读取图书信息,并打印输出到屏幕 

#include <stdio.h>
#define N 10
#define M 80

typedef struct {
    char name[M];   // 书名 
    char author[M]; // 作者 
} Book;


int main() {
    Book x[N];       //结构体数组
    int i, n;

    FILE* fp;

    // 以读的方式打开文本文件data1.txt 
    fp = fopen("data1.txt", "r");

    // 如果打开文件失败,输出提示信息并返回 
    if (fp == NULL) {
        printf("fail to open file\n");
        return 1;
    }

    // 从文件中读取图书信息,保存到结构体数组x中
    i = 0;
    while (!feof(fp))                 //feof()当遇到文件末尾时返回非0否则返回0
    {
        fscanf(fp, "%s%s", x[i].name, x[i].author);      //从文件中读取图书信息
        ++i;
    }
    n = i - 1;

    // 将图书信息打印输出到屏幕上
    for (i = 0; i < n; ++i)
        printf("%d. %-20s%-20s\n", i + 1, x[i].name, x[i].author);

    fclose(fp);

    return 0;
}
*/

2. 实验任务2
/*
// 将图书信息写入二进制文件data2.dat
#include <stdio.h>
#define N 7
#define M 80
typedef struct {
    char name[M];   // 书名 
    char author[M]; // 作者 
} Book;
int main() {
    Book x[N] = { {"《雕塑家》", "斯科特.麦克劳德"},
                  {"《灯塔》", "克里斯多夫.夏布特"},
                  {"《五号屠宰场》", "库尔特.冯内古特"},
                  {"《出卖月亮的人》", "罗伯特.海因莱茵"},
                  {"《大地之上》", "罗欣顿·米斯特里"},
                  {"《上学记》", "何兆武"},
                  {"《命运》", "蔡崇达"} };
    int i;
    FILE* fp;

    // 以写的方式打开二进制文件data2.dat 
    fp = fopen("data2.dat", "wb");

    // 如果打开文件失败,输出提示信息并返回 
    if (fp == NULL) {
        printf("fail to open file\n");
        return 1;
    }

    // 将结构体数组x中的图书信息以数据块方式写入文件data2.dat
    fwrite(x, sizeof(Book), N, fp);

    fclose(fp);

    return 0;
}
*/

/*
// 从二进制文件data2.dat读取图书信息,并打印输出到屏幕

#include <stdio.h>
#define N 7
#define M 80

typedef struct {
    char name[M];   // 书名 
    char author[M]; // 作者 
} Book;

int main() {
    Book x[N];
    int i;

    FILE* fp;

    // 以读的方式打开二进制文件data2.dat 
    fp = fopen("data2.dat", "rb");

    // 如果打开文件失败,输出提示信息并返回 
    if (fp == NULL) {
        printf("fail to open file\n");
        return 1;
    }

    // 从文件data2.dat以数据块方式读入图书信息数据到结构体数组x
    fread(x, sizeof(Book), N, fp);

    // 在屏幕上输出结构体数组x中存储的图书信息
    for (i = 0; i < N; ++i)
        printf("%d. %-20s%-20s\n", i + 1, x[i].name, x[i].author);

    fclose(fp);

    return 0;
}
*/

3. 实验任务3
/*
// 使用fputs()将字符串写入文本文件

#include <stdio.h>
#define N 5
#define M 80

int main() {
    char songs[N][M] = { "Working\'s Blues",
                         "Everything Will Flow",
                         "Streets of London",
                         "Perfect Day",
                         "Philadelphia" };
    int i;
    FILE* fp;

    fp = fopen("data3.txt", "w");
    if (fp == NULL) {
        printf("fail to open file\n");
        return 1;
    }

    for (i = 0; i < N; ++i) {
        fputs(songs[i], fp);       //写入的内容不包括字符串的结束标志,也不会自动包括换行符
        fputs("\n", fp);
    }

    fclose(fp);
    return 0;
}
*/

 

/*
// 使用fgets()从文件中读取字符串并在屏幕上显示

#include <stdio.h>
#define N 5
#define M 80

int main() {
    char songs[N][M];
    int i;
    FILE* fp;

    fp = fopen("data3.txt", "r");
    if (fp == NULL) {
        printf("fail to open file\n");
        return 1;
    }

    for (i = 0; i < N; ++i)
        fgets(songs[i], 80, fp); //表示从fp位置开始读入79个字符并自动包含字符串结束标识符"\0"存放到字符数组中;

    for (i = 0; i < N; ++i)
        printf("%d. %s", i + 1, songs[i]);

    fclose(fp);
    return 0;
}
*/

4. 实验任务4
/*
//编写程序统计文件中字符数(不包括空白符(空格、回车、tab键))。
#include<stdio.h>
int main()
{
    char c;
    int count=0;
    FILE* p;
    p = fopen("data4.txt", "r");
    if (p == NULL)
    {
        printf("fail to open the file\n");
        return -1;
    }
    c = fgetc(p);
    while (c != EOF)
    {
        if (c != ' ' && c != '\n' && c != '\t')
        {
            count++;
            c = fgetc(p);
        }
        else
            c = fgetc(p);
    }
    
    printf("data4.txt中共包含字符数(不计空白符):%d", count);
    fclose(p);
    return 0;
}
*/

5. 实验任务5
/*
//某省计算机等级考试的终成绩是由两部分组成的:客观题和操作题组成。学生信息包含准考证
//号、学生姓名、客观题分数、操作题分数、总得分和等级。其中客观题占40% ,操作题占60% 。
//其中,N名考生信息及客观题分数、操作题分数已经存在文本文件examinee.txt中,要求从文件中
//读取考生成绩信息,计算后将结果显示在屏幕上,同时写入文本文件result.txt。
//编写函数process(),实现如下功能:
//根据客观题和操作题的分数计算学生的总得分,并对学生的总得分进行排序,然后对总得分前10%
//的学生的等级确定为"优秀",前10 % -50 % 之间(不包含10 % 但包含50 % 的学生)确定为"合格",其余
//学生等级确定为"不合格"。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 10

typedef struct {
    long int id;
    char name[20];
    float objective;    // 客观题得分
    float subjective;   // 操作题得分
    float sum;
    char level[10];
} STU;

// 函数声明
void input(STU s[], int n);
void output(STU s[], int n);
void process(STU s[], int n);

int main() {
    STU stu[N];

    printf("从文件读入%d个考生信息: 准考证号,姓名,客观题得分(<=40),操作题得分(<=60)\n", N);
    input(stu, N);

    printf("\n对考生信息进行处理: 计算总分,确定等级\n");
    process(stu, N);

    printf("\n打印考生完整信息, 并保存到文件中");
    output(stu, N);

    return 0;
}

// 从文本文件examinee.txt读入考生信息:准考证号,姓名,客观题得分,操作题得分
void input(STU s[], int n) {
    int i;
    FILE* fin;

    fin = fopen("examinee.txt", "r");
    if (fin == NULL) {
        printf("fail to open file\n");
        exit(0);
    }

    while (!feof(fin)) {
        for (i = 0; i < n; i++)
            fscanf(fin, "%ld %s %f %f", &s[i].id, s[i].name, &s[i].objective, &s[i].subjective);
    }

    fclose(fin);
}

// 输出考生完整信息: 准考证号,姓名,客观题得分,操作题得分,总分,等级
// 不仅输出到屏幕上,还写到文本文件result.txt中
void output(STU s[], int n) {
    FILE* fout;
    int i;

    // 输出到屏幕
    printf("\n");
    printf("准考证号\t姓名\t客观题得分\t操作题得分\t总分\t\t等级\n");
    for (i = 0; i < n; i++)
        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);

    // 保存到文件 
    fout = fopen("result.txt", "w");
    if (!fout) {
        printf("fail to open or create result.txt\n");
        exit(0);
    }

    fprintf(fout, "准考证号\t\t姓名\t客观题得分\t操作题得分\t总分\t\t等级\n");

    for (i = 0; i < n; i++)
        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);

    fclose(fout);
}

// 对考生信息进行处理:计算总分,排序,确定等级
void process(STU s[], int n) 
{
    STU t;
    for (int i = 0; i < n; i++)
    {
        s[i].sum = s[i].objective + s[i].subjective;
    }
    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1 - i; j++)
        {
            if (s[j].sum < s[j + 1].sum)
            {
                t = s[j];
                s[j] = s[j + 1];
                s[j + 1] = t;   
            }
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (i <= 0.1 * n)
            strcpy(s[i - 1].level, "优秀");
        else if (i > 0.1 * n && i <= 0.5 * n)
            strcpy(s[i - 1].level, "合格");
        else
            strcpy(s[i - 1].level, "不合格");

    }
    
}
*/

 6. 实验任务6

//编程实现随机抽点5位学生信息,显示在屏幕上;同时,写入文件lucky.txt中程序正确编写后,预期测试结果如下:
//被抽取到的学生信息不能重复(即,同一名学生不能重复出现在抽点名单中)
//读取当前系统日期作自动生成文件名
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define N 80
typedef struct 
{
    long id;
    char name[10];
    char class[20];

}STU;
int main()
{
    STU s[N];
    FILE* p;
    FILE* ptr;
    time_t t;
    struct tm* nt;
    time(&t);
    nt = localtime(&t);
    char now_time[80];
    strftime(now_time, 80, "%Y%m%d.txt", nt);
    //printf("%s", now_time);
    int rn;
    p = fopen("list.txt", "rb");
    ptr = fopen(now_time, "w");
    for (int i = 0; i < N; i++)
    {
        fscanf(p, "%ld%s%s",&s[i].id,s[i].name,s[i].class);
    }
    srand(time(0));
    int m[5];
    int mark = 0;
    for (int i = 0; i < 5; i++)
    {
        rn = rand() % 80;
        m[i] = rn;
        while (1)
        {
            for (int j = 0; j < i; j++)
            {
                if (m[j] == m[i])
                {
                    mark = 1;
                    break;
                }
            }
            if (mark)
            {
                rn = rand() % 80;
                m[i] = rn;
            }
            else
                break;
        }
    }
    for (int i = 0; i < 5; i++)
    {
        fprintf(ptr, "%ld\t%s\t%s", s[m[i]].id, s[m[i]].name, s[m[i]].class);
        fprintf(ptr, "%c", '\n');
        printf("%ld\t%s\t%s\n", s[m[i]].id, s[m[i]].name, s[m[i]].class);
    }
    
    fclose(p);
    fclose(ptr);
    return 0;
    
    
}

 

 

posted @ 2022-12-27 23:04  mli_littlewith  阅读(22)  评论(0编辑  收藏  举报